今天,当绑定发现一个bug时,我发现TreeMap迭代器行为在删除对象时有点奇怪。事实上已经我测试不同的用途,在一个简单的例子: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());
}
}
然后,对于关键= 4结果为5,而对于key = 5,结果为5,因为链接在移除时被更改。但为什么行为不同。 JIT?即使这是答案,他们是不是应该统一?
您提供的代码将永远不会打印任何内容,因为没有条目具有“X”键。请显示一个简短的*完整的*程序来说明问题。 –
@Jon Skeet:我猜X是3或4的占位符? – home
@home:很可能 - 但如果OP只给了我们一个完整的程序准备编译并运行,将会更容易重现... –