亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

迭代時刪除離開元素并且不拋出并發 E

迭代時刪除離開元素并且不拋出并發 E

慕的地8271018 2023-04-19 17:01:14
我遇到了這段代碼,它在迭代時從列表中刪除了項目,但它并沒有拋出并發異常并在列表中留下了一些項目。這是為什么?例子:。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一切都按預期工作。
查看完整描述

1 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

首先,如果您向列表中添加更多元素,它仍然會失敗并顯示ConcurrentModificationException.

由于發布的示例沒有失敗,我們必須看看內部發生了什么。

如果您進行調試,您會在發布的示例中看到,兩個循環僅迭代一次。刪除內部循環(方法)中的元素removeInteger會耗盡兩個迭代器。由于沒有進一步的交互,因此不會導致錯誤。“僅”修改后的調用Iterator#next可能導致 ConcurrentModificationException。

是的,但為什么它會耗盡它們呢?

查看源代碼ArrayList#Itr我們可以看到

   public boolean hasNext() {
          return cursor != size;
   }

只檢查一個名為 的變量size。此變量size是 的屬性ArrayList。當remove被調用時,該變量遞減。因此,下次hasNext調用時,迭代器假定不再有新元素。

旁注:cursor指向列表中的下一個元素。


查看完整回答
反對 回復 2023-04-19
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號