增強for為什麼不能刪除集合裡的元素

2021-10-09 17:53:07 字數 1575 閱讀 5578

1.先看看arraylist物件呼叫iterator()返回的iterator物件

public iterator iterator()

1232.再看看arraylist中實現iterator的內部類itr

private class itr implements iterator

12345

3.看迭代器的hasnext()方法

public boolean hasnext()

123hasnext() 的判斷條件是cursor != size. 只要沒遍歷到最後乙個元素,就返回true.

4.下面是next()

public e next()

1234567

5.現在看下例子

arraylist list = new arraylist();

list.add(「e1」);

list.add(「e2」);

iterator var2 = list.iterator();

while(var2.hasnext())

}12345678910

執行會報錯,這種操作是不被允許的。

6.解釋:

第一次 呼叫var2.hasnext(),此時滿足條件 cursor(0) != size(2),然後執行 var2.next(),此時 cursor=1

執行 list.remove(「e1」),此時,list的size將從2變為1當執行完第一次迴圈,進入第二次hasnext()判斷時,cursor=1而且size=1,導致iterator認為已經遍歷結束,因此e2將被漏掉。此時,過程已非常清楚。list本有2個元素,iterator第一次獲取元素時,程式刪掉了當前元素,導致list的size變為1。iterator第二次獲取元素時,開心說到:」list一共只有乙個元素,我已經遍歷了乙個,easy,輕鬆搞定!」。

矛盾點在於:hasnext() 是根據已fetch元素和被遍歷物件的size動態判斷的,一旦遍歷過程中被遍歷物件的size變化,就會出現以上問題。

7.正確的姿勢,在使用迭代器遍歷的時候對集合元素進行增刪

將remove操作交給iterator來處理,使用iterator介面提供的remove操作。

list list = new arraylist<>();

list.add(「e1」);

list.add(「e2」);

for (iterator iterator = list.iterator(); iterator.hasnext(); )

if ("e2".equals(str))
}

1234567891011121314

執行結果:element 2 fetched 被正常列印出來。 那iterator的remove()又是怎麼做的?下面是arraylist中迭代器的remove方法。

public void remove() catch (indexoutofbound***ception ex) }

1234567891011121314

因為iterator.remove()在執行集合本身的remove後,同時對游標進行了 「校準」。

為什麼不能在增強for中刪除集合的元素

學習的過程中遇到的乙個問題,下述 在嘗試remove其他元素的時候會出現異常,而在remove最後乙個元素的時候,可以正常執行.public class main 初步查詢後得知,增強for和迭代器遍歷的過程中,直接用集合去remove以及其他修改集合的操作很容易出現問題.之後debug 翻原始碼分...

為什麼靜態方法裡不能有靜態變數

在方法內部定義的叫 區域性變數 而不是靜態變數,區域性變數不能加static,包括protected,private,public這些也不能加,而全域性變數是可以的,靜態變數是定義在類中,方法體外面的,區域性變數是儲存在棧中的,而靜態變數儲存在方法區,區域性變數出了方法就會被棧 了,而靜態變數不會,...

為什麼中斷不能休眠

1.中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷 這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠 如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wa...