2012-06-19 46 views
5

我玩过java.util.HashMap以了解fail-fast行为是什么。java快速行为失败HashMap

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)

itera的故障快速行为tor不能保证,因为一般来说,不可能在 存在非同步并发修改中做出任何硬性保证。快速失败的迭代器 抛出ConcurrentModificationException一个尽力而为的原则

我检查另一thread它说,它会抛出ConcurrentModificationException你觉得..what吗?

+0

尝试调用'clear()'而不是'remove()'。 – Bringer128

回答

6

既然你已经显示输出:

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

因为13是最后的键值对,当你Iterate通过你的HashMap,最后删除对应stark 13的键值,即停止Iteration刚刚HashMap已被修改,因此,它不再iterate了。所以没有ConcurrentModificationException.

+0

谢谢..我从来没有注意到..'if(key.equals(“jon”))'会抛出异常.. – damon