当尝试删除包含在迭代器中的对象时,Java 8 和 Java 9+ 的行为不同。考虑以下示例:
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
class Scratch {
public static void main(String[] args) {
Set<Date> dates = new HashSet<>();
dates.add(new Date(100));
dates.add(new Date(200));
for (Date date : dates) {
System.out.println("Initial "+date.getTime()+":"+date.hashCode());
date.setTime(date.getTime()+42);
System.out.println("Mutated "+date.getTime()+":"+date.hashCode()+"\n");
}
System.out.println("Size before remove iteration: "+dates.size());
Iterator<Date> iterator = dates.iterator();
while (iterator.hasnext()) {
Date date = iterator.next();
System.out.println("In loop: "+date.getTime()+":"+date.hashCode());
iterator.remove();
}
System.out.println("Size after remove iteration: "+dates.size());
}
}
在 HashSet 中改变对象后,Java 8 拒绝使用迭代器删除它们,检查删除循环后的大小。 Java 8 输出:
Initial 100:100
Mutated 142:142
Initial 200:200
Mutated 242:242
Size before remove iteration: 2
In while loop: 142:142
In while loop: 242:242
Size after remove iteration: 2
Java 9+ 输出与上面相同,但:
Size after remove iteration: 0
为什么会发生这种情况?