例:public class TestMain {
public static void main(String[] args) {
List<String> lists = new ArrayList<>();
lists.add("a");
lists.add("b");
lists.add("c");
Iterator<String> str = lists.iterator();
while (str.hasNext()) {
String s= str.next();
lists.remove(s);
}
}
}
结果:Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:886)
at java.util.ArrayList$Itr.next(ArrayList.java:836)
at TestMain.main(TestMain.java:17)
这点只要仔细读一下ArrayList源码的人都会知道原因的
private class Itr implements Iterator<E> {
int cursor; int lastRet = -1; int expectedModCount = modCount;
主要就是ArrayList内部类中的
int expectedModCount = modCount;这个变量,
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
这里面只修改了
modCount++;
导致
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
方法中的checkForComodification方法校验时不通过
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
但是开发规范中发举了一个反例
例:public class TestMain {
public static void main(String[] args) {
List<String> lists = new ArrayList<>();
lists.add("a");
lists.add("b");
//lists.add("c");//这行注释掉
Iterator<String> str = lists.iterator();
while (str.hasNext()) {
String s= str.next();
lists.remove(s);
}
}
}
工作清闲时候在读阿里java开发规范突然发现一个关于list集合操作有意思的点,觉的很有意思我们都知道操作list数据集合时,如果使用迭代器并用list集合本身的remove方法移除数据时,会发生 java.util.ConcurrentModificationException 异常,例:public class TestMain { public static void ma