看看这个小片的代码:为什么不在这里引发ConcurrentModificationException?
ArrayList al = new ArrayList();
al.add("AA");
al.add("AB");
al.add("AC");
Iterator it = al.iterator();
while(it.hasNext()){
String s = (String)it.next();
if(s.equals("AB")){
al.remove(1);
}
}
由于ArrayList中具有快速失败迭代,并清楚地,这将使得remove()
方法不可用的给定的ArrayList不是由固定大小的阵列(),上面的代码应该抛出ConcurrentModificationException
,但是,它没有。另外,如果我在循环中插入一条打印语句(作为第一条语句),它将显示循环不会第三次迭代,并且它会优雅地退出。
我知道这听起来太傻,但我能想到的虚假的唯一原因是去除元素的发生后的元素已遍历的迭代器的事实。但是,情况并非如此,因为modificationCount
仍然通过删除进行修改,因此它必须抛出异常。
只是做
while(it.hasNext()){
it.next();
al.remove(1);
}
也不过抛出ConcurrentModificationException。
任何见解?谢谢!
喜欢精确,简短和健康的答案!非常感谢。 –