[英]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.