java HashMap的快速行为失败

时间:2012-06-19 03:53:06

标签: 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));
}

我得到了结果

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 ..这是因为(来自javadoc)

  

迭代器的失败快速行为无法保证,因为它,   一般来说,不可能做出任何硬性保证   存在不同步的并发修改。快速失败   迭代器在尽力而为的基础上抛出ConcurrentModificationException

我检查了另一个thread,它说,它会抛出ConcurrentModificationException ..你觉得怎么样?

1 个答案:

答案 0 :(得分:6)

鉴于您显示的输出:

12
11
10
14
13   // notice this?
after modifn
12
11
10
14

由于13是最后一个键值对,当您Iterate通过HashMap然后最终删除与stark 13对应的键值时,会停止IterationHashMap被修改之后,因此它不再是iterate。所以没有ConcurrentModificationException.