dam*_*mon 5 java hashmap concurrentmodification
我一起玩java.util.HashMap,了解fail-fast行为是什么.
HashMap map = new HashMap();
map.put("jon", 10);
map.put("sean", 11);
map.put("jim", 12);
map.put("stark", 13);
map.put("vic", 14);
Set keys = map.keySet();
for(Object k:keys) {
System.out.println(map.get(k));
}
for(Object k:keys) {
String key =(String)k;
if(key.equals("stark")) {
map.remove(key);
}
}
System.out.println("after modifn");
for(Object k:keys) {
System.out.println(map.get(k));
}
Run Code Online (Sandbox Code Playgroud)
我得到了结果
12
11
10
14
13
after modifn
12
11
10
14
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用迭代器
Iterator<String> itr = keys.iterator();
while(itr.hasNext()) {
String key = itr.next();
if(key.equals("stark")) {
map.remove(key);
}
}
Run Code Online (Sandbox Code Playgroud)
ConcurrentModificationException在任何一种情况下我都没有得到任何东西..这是因为(来自javadoc)
迭代器的快速失败行为无法得到保证,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何硬性保证.失败快速迭代器会尽最大努力抛出ConcurrentModificationException
我查了另一个帖子说,它会扔掉ConcurrentModificationException......你觉得怎么样?
鉴于您显示的输出:
12
11
10
14
13 // notice this?
after modifn
12
11
10
14
Run Code Online (Sandbox Code Playgroud)
因为13是最后的键值对,当你Iterate通过你的HashMap,最后删除对应的键值stark 13,即停止Iteration该刚过HashMap已被修改,因此,它没有iterate了.所以不行ConcurrentModificationException.