为什么更改key的值会改变并发Hashmap的输出?

时间:2017-03-22 07:10:46

标签: java eclipse collections concurrenthashmap

我在eclipse IDE上使用并发HashMap,并且遇到了这样一个事实,即在更改并发HashMap的键时,我的输出也会发生变化。
案例I:

 public static void main(String[] args) {       
    ConcurrentHashMap<String, String> concurrentHashMap= new ConcurrentHashMap<String, String>();
    concurrentHashMap.put("Fav Rap", "Eminem");
    concurrentHashMap.put("Fav Food", "Pizza");
    concurrentHashMap.put("Pop", "Jackson");

    for(Map.Entry<String, String> entry : concurrentHashMap.entrySet()){
        concurrentHashMap.put("Fav Game", "Fifa");
        concurrentHashMap.put("student", "smith");

        System.out.println("Key : "+entry.getKey()+",   Value : "+entry.getValue()+" hashcode: "+entry.hashCode()+" size: "+concurrentHashMap.size());
    }

}

输出结果为:

Key:Pop,Value:Jackson hashcode:-172386558 size:5

Key:Fav Rap,价值:Eminem哈希码:1491542025大小:5

Key:student,Value:smith hashcode:-1988544968 size:5

Key:Fav Game,Value:Fifa hashcode:1043213001 size:5

Key:Fav Food,Value:Pizza hashcode:983035627 size:5

案例II:

    public static void main(String[] args) {
    ConcurrentHashMap<String, String> concurrentHashMap= new ConcurrentHashMap<String, String>();
    concurrentHashMap.put("Fav1 Rap", "Eminem");
    concurrentHashMap.put("Fav Food", "Pizza");
    concurrentHashMap.put("Pop", "Jackson");

    for(Map.Entry<String, String> entry : concurrentHashMap.entrySet()){
        concurrentHashMap.put("Fav Game", "Fifa");
        concurrentHashMap.put("student", "smith");
        System.out.println("Key : "+entry.getKey()+",   Value : "+entry.getValue()+" hashcode: "+entry.hashCode()+" size: "+concurrentHashMap.size());
    }

}

输出结果为:

Key:Pop,Value:Jackson hashcode:-172386558 size:5

Key:Fav1 Rap,价值:Eminem哈希码:1157829666大小:5

Key:Fav Food,Value:Pizza hashcode:983035627 size:5

我刚刚将地图的第一个键从Fav更改为Fav1,输出也发生了变化。 你能澄清一下我的疑问吗?在此先感谢:)

3 个答案:

答案 0 :(得分:2)

这是并发哈希映射的工作方式。如果你看一下添加所有值后输出会是相同的。在迭代时,您在其中添加项,根据迭代器中的对象引用,案例行为会有所不同。

答案 1 :(得分:0)

ConcurrentHashMap中的检索操作(包括get)不会阻止,因此可能重叠更新操作(包括put(,如你的情况)和删除)。

答案 2 :(得分:0)

我认为你应该尝试重新编译你的项目。因为我在IDE中尝试了你的代码。它运作良好。它给了我5个输出,就像在案例I中一样。当我将Fav Rap改为Fav1 Rap时,我输出了。

   Key : Fav Food,   Value : Pizza hashcode: 983035627 size: 5
   Key : Pop,   Value : Jackson hashcode: -172386558 size: 5
   Key : Fav1 Rap,   Value : Eminem hashcode: 1157829666 size: 5
   Key : Fav Game,   Value : Fifa hashcode: 1043213001 size: 5
   Key : student,   Value : smith hashcode: -1988544968 size: 5