Java subList 拋ConcurrentModificationException的問題


工作中的有些場景會用到subList,但是如果沒有正確的使用,可能會出現以下場景的問題,請看例子:

public static void main(String[] args) {   List<Integer> listOri = new ArrayList<>();   listOri.add(1);   listOri.add(2);   listOri.add(3);   listOri.add(4);   listOri.add(5);      List<Integer> listSub = listOri.subList(0, 3);   System.out.println("ori:" + listOri.size());   System.out.println("sub:" + listSub.size());   listSub.add(6);   System.out.println("after sub add");   System.out.println("ori:" + listOri.size());   System.out.println("sub:" + listSub.size());   listOri.add(7);   System.out.println("after ori add");   System.out.println("ori:" + listOri.size());   System.out.println("sub:" + listSub.size()); }

代碼中,我先是初始化了list,然后正常使用subList,然后分別對subList和list進行新增操作,並打印出他們的size,運行結果如下:

ori:5
sub:3
after sub add
ori:6
sub:4
after ori add
ori:7
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1169)
at java.util.ArrayList$SubList.size(ArrayList.java:998)
at com.vivo.exappstore.api.service.impl.SearchServiceImpl.main(SearchServiceImpl.java:228)

 

解釋一下原因:

首先subList的add等操作是對原始list進行操作,並把操作后的modCount賦給自己

public void add(int index, E e) {
  rangeCheckForAdd(index);
  checkForComodification();
  parent.add(parentOffset + index, e);
  this.modCount = parent.modCount;
  this.size++;
}

其次subList獲取size時會對modCount做校驗,並且校驗的是原始list和自己是否相等

public int size() {
  checkForComodification();
  return size;
}

private void checkForComodification() {
  if (ArrayList.this.modCount != this.modCount)
  throw new ConcurrentModificationException();
}

因此當對原始的list進行add的時候,subList的modCount感知不到,會導致subList的checkForComodification失敗

生成subList后對原始list進行增刪改需要小心

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM