Java 为什么我';在迭代期间从ArrayList中删除元素时,我没有得到ConcurrentModificationException
我使用以下代码循环遍历arraylist,然后从arraylist中删除一个元素 这里我期待ConcurrentModificationException。但没有得到例外。特别是当您使用第(n-1)个元素检查条件时。请帮帮我。下面是我的代码Java 为什么我';在迭代期间从ArrayList中删除元素时,我没有得到ConcurrentModificationException,java,arraylist,concurrency,fail-fast,java-failsafe,Java,Arraylist,Concurrency,Fail Fast,Java Failsafe,我使用以下代码循环遍历arraylist,然后从arraylist中删除一个元素 这里我期待ConcurrentModificationException。但没有得到例外。特别是当您使用第(n-1)个元素检查条件时。请帮帮我。下面是我的代码 ArrayList<Integer> arrayList = new ArrayList<Integer>(); for (int i = 1; i <= 10; i++) { arrayLis
ArrayList<Integer> arrayList = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
arrayList.add(5 * i);
}
System.out.println(arrayList);
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext()) {
Integer temp = iterator.next();
if (temp == 45) {
/**
* temp == 40 (then i'm getting *ConcurrentModificationException) why not i'm
* getting ConcurrentModificationException if (temp == 45)
*/
arrayList.remove(1);
}
}
System.out.println(arrayList);
ArrayList ArrayList=new ArrayList();
对于(inti=1;i,实现尽最大努力检测并发修改,但在某些情况下它无法检测到并发修改
为ArrayList
的Iterator
返回的Iterator
实现检查next()
和remove()
中的并发修改,但不检查hasNext()
中的并发修改,其逻辑为:
public boolean hasNext() {
return cursor != size;
}
由于在迭代器
的光标位于最后一个元素之前的元素时删除了一个元素,因此删除会导致hasNext()
返回false
(因为大小
在删除后变为等于光标
),它结束循环而不引发异常。这不是万无一失的。如果注意到修改,就会引发异常,但并不总是注意到。如果我将45
更改为25
,则会引发异常。请改用iterator.remove();
来消除异常。