首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java HashMap的快速失效行为

java HashMap的快速失效行为
EN

Stack Overflow用户
提问于 2012-06-19 03:53:06
回答 1查看 1.1K关注 0票数 5

我和java.util.HashMap一起玩,了解fail-fast的行为是什么。

代码语言:javascript
复制
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));
}

我得到了结果

代码语言:javascript
复制
12
11
10
14
13
after modifn
12
11
10
14

我还尝试使用迭代器

代码语言:javascript
复制
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,你觉得呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-19 04:16:42

考虑到您所显示的输出:

代码语言:javascript
复制
12
11
10
14
13   // notice this?
after modifn
12
11
10
14

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11094139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档