今天在试图发现 bug 时,我发现 TreeMap 迭代器在删除对象时的行为有些奇怪。实际上,在测试不同用法时,我发现了一个简单的例子:
TreeMap<String, String> map = new TreeMap<String, String>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
map.put("5", "5");
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
System.out.println("Before "+entry.getKey());
iterator.remove();
System.out.println("After " +entry.getKey());
}
结果如下:
Before 1
After 1
Before 2
After 2
Before 3
After 3
Before 4
After 4
Before 5
After 5
但是如果我将它改成:
TreeMap<String, String> map = new TreeMap<String, String>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
map.put("5", "5");
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
String key = "4";
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if(entry.getKey().equals(key)){
iterator.remove();
System.out.println(entry.getKey());
}
}
当 key = 4 时,由于链接被删除而导致结果为 5;当 key = 5 时,其结果也为 5。但是为什么行为会不同呢?是JIT的缘故吗?即使是这个原因,它们也应该是一致的吧。