如果有不对的地方请大家指出来哈
现在我们有一个需求:
需求:如果li集合中有'0',则再add一个元素'x'
List<String> li = new ArrayList<String>();
li.add("111");
li.add("222");
li.add("0");
li.add("333");
Iterator<String> it = li.iterator();
while (it.hasNext()){
if(it.next().equals("0")){
li.add("X");
}
}
我们看这段代码的逻辑并没有错
但是执行时却会抛出ConcurrentModificationException 并发修改异常,,这是为什么呢
我们根据异常找到相应的方法、Itr.next()
我们查看Array List源码的时候发现iterator()方法返回了一个内部类
这个内部类重写了next() remove()方法,现在我们主要看出了错误的next()方法和里面的checkForComodification()方法
我们找到这个方法后发现他是这样写的,这个modCount 和expectedModCount是啥意思呢
modCount :实际修改的次数
expectedModCount:预计修改的次数
这个两个数在内部类 Itr 中是相等的而且,初始值为0(这个在 AbstractList中有写到)
此时我们想到我们用了add方法我们发现在add方法中modCount被增加了expectedModCount没有增加,此时就抛出了java.util.ConcurrentModificationException 并发修改异常
我们怎末解决呢,我们可以用li的get(i)来解决,因为get(index i)没有对modCount的值进行改变
for(int i=0;i<li.size();i++){
if(li.get(i).equals("0")){
li.add("x");
}
System.out.println(li.get(i));
}