首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java List.subList() 共享底層數組導致的 ConcurrentModificationException 陷阱與解決策略

     編輯:程式設計疑難解答

問題重現

List<String> list = new ArrayList<>();
list.add("hello"); list.add("world");
List<String> subList = list.subList(1, 2);
list.add("to"); // 修改父列表
System.out.println(subList); // 拋出 ConcurrentModificationException

原理

ArrayList.subList 返回的 SubList 視圖直接引用父列表的底層數組 elementData,僅記錄 offset 和 size。父列表結構性修改(增/刪)導致 modCount 變化,子列表迭代器檢測到 expectedModCount != modCount 即拋出異常(fail-fast 機制)。

解決策略

  1. 複製而非視圖:List<String> copy = new ArrayList<>(list.subList(1, 2)); 獨立數組,互不影響。
  2. 僅讀視圖:Collections.unmodifiableList(list.subList(...)) 禁止修改,讀取安全。
  3. 同步修改:若必須共享,父列表修改前先獲取子列表迭代器,或使用 CopyOnWriteArrayList。

最佳實踐

默認對 subList 結果進行拷貝(new ArrayList<>(subList)),除非極度確定父列表不再修改且性能敏感。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved