java HashMap的快速行为失败

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......你觉得怎么样?

Kaz*_*ara 6

鉴于您显示的输出:

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.