When trying to remove objects wrapped in iterator Java 8 and Java 9+ behave differently. Consider the following example:
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());
}
}
After mutating objects inside the HashSet Java 8 refuses to remove them using iterator, check the size after removal loop. Java 8 output:
Initial 100:100
Mutated 142:142
Initial 200:200
Mutated 242:242
Size before remove iteration: 2
In loop: 142:142
In loop: 242:242
Size after remove iteration: 2
Java 9+ output is same as above but:
Size after remove iteration: 0
Why does this happen?