看看這個小片的代碼:爲什麼不在這裏引發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。
任何見解?謝謝!
喜歡精確,簡短和健康的答案!非常感謝。 –