我和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));
}我得到了结果
12
11
10
14
13
after modifn
12
11
10
14我还尝试使用迭代器
Iterator<String> itr = keys.iterator();
while(itr.hasNext()) {
String key = itr.next();
if(key.equals("stark")) {
map.remove(key);
}
}在这两种情况下,我都没有得到任何ConcurrentModificationException ( ..Is ),因为(来自javadoc)
迭代器的抗故障行为不能保证,一般来说,在不同步并发修改的情况下不可能提供任何硬的保证。快速失败的迭代器在最大努力的基础上抛出ConcurrentModificationException。
我检查了另一个thread,上面写着,它会抛出ConcurrentModificationException..what,你觉得呢?
发布于 2012-06-19 04:16:42
考虑到您所显示的输出:
12
11
10
14
13 // notice this?
after modifn
12
11
10
14因为13是最后一个键值对,当您通过Iterate通过HashMap,然后最后删除与stark 13对应的键值时,就会在HashMap被修改之后停止Iteration,因此它不再是iterate了。所以没有ConcurrentModificationException.
https://stackoverflow.com/questions/11094139
复制相似问题