第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

慕的地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指向列表中的下一個元素。


查看完整回答
反對 回復(fù) 2023-04-19
  • 1 回答
  • 0 關(guān)注
  • 135 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號