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...