慕的地8271018
2023-04-19 17:01:14
我遇到了這段代碼,它在迭代時從列表中刪除了項(xiàng)目,但它并沒有拋出并發(fā)異常并在列表中留下了一些項(xiàng)目。這是為什么?例子:。public class Application { public static void main(String[] args) { List<Integer> integerList = new ArrayList<Integer>(); integerList.add(1); integerList.add(2); for (Integer integer : integerList) { removeInteger(integerList, integer); } System.out.println(integerList.toString()); // prints [2] as it was not removed (while it should be) } private static void removeInteger(List<Integer> integerList, Integer integer) { for (Integer integer1 : integerList) { if (integer.equals(integer1)) { int index = integerList.indexOf(integer); if (index >= 0) { integerList.remove(index); } } } }}如果我將removeInteger方法更改為 useIterator而不是main我傳遞的副本,則integerList一切都按預(yù)期工作。
1 回答

holdtom
TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個贊
首先,如果您向列表中添加更多元素,它仍然會失敗并顯示ConcurrentModificationException.
由于發(fā)布的示例沒有失敗,我們必須看看內(nèi)部發(fā)生了什么。
如果您進(jìn)行調(diào)試,您會在發(fā)布的示例中看到,兩個循環(huán)僅迭代一次。刪除內(nèi)部循環(huán)(方法)中的元素removeInteger
會耗盡兩個迭代器。由于沒有進(jìn)一步的交互,因此不會導(dǎo)致錯誤?!皟H”修改后的調(diào)用Iterator#next
可能導(dǎo)致 ConcurrentModificationException。
是的,但為什么它會耗盡它們呢?
查看源代碼ArrayList#Itr
我們可以看到
public boolean hasNext() { return cursor != size; }
只檢查一個名為 的變量size
。此變量size
是 的屬性ArrayList
。當(dāng)remove
被調(diào)用時,該變量遞減。因此,下次hasNext
調(diào)用時,迭代器假定不再有新元素。
旁注:cursor
指向列表中的下一個元素。
添加回答
舉報(bào)
0/150
提交
取消