我知道在ArrayList中,这个类的iterator和listIterator方法返回的迭代器都是快速失败的。
所以,如果我写下面的东西。由于我使用List对象来删除而不是使用Iterator删除所以它抛出了concurrentModification异常,因为在这种情况下expectedModCount不等于ModCount。
List<String> n = new ArrayList<String>();
n.add("1");
n.add("2");
n.add("3");
n.add("4");
Iterator<String> i = n.iterator();
while(i.hasNext())
{
String t = i.next();
if(t.equals("4"))
n.remove(t);
System.out.println(t);
}
但是如果删除列表中的倒数第二个元素,则不会抛出异常。
即如果你写(在if语句t.remove("1")
或t.remove("2")
或t.remove("4")
),它会抛出concurrentModificationException
。但如果我写t.remove("3")
,那么这个例外是没有抛出。
可能是什么原因?
答案 0 :(得分:0)
在AbstractList中有一个名为modCount的字段,用于存储此列表已被结构修改的次数,以及一个名为Itr的实现Iterator的内部类创建了一个名为expectedModCount的变量,该变量在modCount的开头初始化。在迭代modCount!= expectedModCount
期间抛出concurrentModificationException
这是代码
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}