簡體   English   中英

為什么此Java代碼有效?

[英]Why is this java code working?

在迭代期間,不允許從集合中刪除。 我有一段正在工作的代碼,我認為應該行不通。 它將來會失敗嗎,為什么現在可以工作?

public class RemoveFromSet {

    static Set<Integer> set = new HashSet<>();
    public static void main(String[] args) {
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        while(set.size()>0) {
            int val = set.iterator().next();
            set.remove(val);
            System.out.println("removed val = "+val);
        }
    }

}

實際上,這應該起作用,因為循環的第一行在每次迭代中都檢索一個全新的迭代器。 現在,如果在刪除之后使用了迭代器,那么您將遇到問題。

通常,當您想在循環中從集合中刪除元素時,可以使用Iterator 您的例子是:

Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
    Integer element = iterator.next();
    iterator.remove();
    System.out.println("Removed val = " + element);
}

正如其他答案所指出的那樣,每個循環都獲得一個新的迭代器,這就是為什么沒有出錯的原因。

您的循環不是集合的迭代。 for條件不依賴於迭代器。
自從在循環內創建以來,在循環內的每個迭代器上創建的迭代器都是獨立於for條件的,此外,您無需在該迭代器上進行迭代:您可以在每次迭代時創建該迭代器,並僅獲取第一個值。

如果您真的使用迭代器對集合進行迭代,則失敗,例如:

  public static void main(String[] args) {
    set.add(1);
    set.add(2);
    set.add(3);
    set.add(4);
    for (Iterator iterator = set.iterator(); iterator.hasNext();) {
        Integer integer = (Integer) iterator.next();
        set.remove(integer);
        System.out.println("removed val = " + integer);
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM