【问题标题】:Why changing the value of key changes the output in concurrent Hashmap?为什么更改 key 的值会更改并发 Hashmap 中的输出?
【发布时间】:2017-03-22 07:10:46
【问题描述】:

我在 Eclipse IDE 上使用并发 HashMap,发现在更改并发 HashMap 的键时,我的输出也发生了变化。
案例一:

 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());
    }

}

输出是:

键:流行,值:杰克逊哈希码:-172386558 大小:5

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

键:学生,值:smith 哈希码:-1988544968 大小:5

键:最喜欢的游戏,值:FIFA 哈希码:1043213001 大小:5

键:最喜欢的食物,值:披萨哈希码:983035627 大小:5

案例二:

    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());
    }

}

输出是:

键:流行,值:杰克逊哈希码:-172386558 大小:5

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

键:最喜欢的食物,值:披萨哈希码:983035627 大小:5

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

【问题讨论】:

  • 因为 fav rap 和 fav1 rap 是不同的对象。这就是为什么即使您只是更改了键的名称,它仍然会创建一个新对象 fav1 rap
  • 我没有看到代码中当前条目的键有任何变化。您基本上只是在地图中添加了 2 个条目。
  • @Mr.Aw 我同意它将创建一个 Fav1 说唱的新对象。但是其他两个条目,即 Fav Game 和 student 会发生什么。虽然列表的大小似乎是 5,但显示的数据数量是 3。希望您理解我的担忧。
  • @imprezzeb 如果你敏锐地看到案例 II 我正在将密钥从 Fav Rap(案例 I)更改为 Fav1 Rap(案例 II)。行。所以现在我同意它为 Fav1 Rap 创建了一个新对象。但是在显示为什么它只打印 3 个值时,尽管在第二种情况下大小似乎是 5。希望你能理解我的担忧。
  • @SumeetBarua 我以为你刚刚展示了 3 让我们看到哈希码的变化。我试过你的代码。我还尝试将第一个键从 Fav 更改为 Fav1。但是输出对我来说并没有改变。它仍然给了我 5 个输出

标签: java eclipse collections concurrenthashmap


【解决方案1】:

这是并发哈希映射的工作方式。如果您在添加所有值后查看输出将是相同的。在迭代时,您正在向其中添加项目,这种情况的行为会根据迭代器中的对象引用而有所不同。

【讨论】:

  • 如果你敏锐地看到 case II 我正在将键从 Fav Rap(case I) 更改为 Fav1 Rap(case II)。行。所以现在我同意它为 Fav1 Rap 创建了一个新对象。但是在显示为什么它只打印 3 个值时,尽管地图的大小在第二种情况下似乎是 5。希望你能理解我的担忧。
  • 这是因为您在地图的 entryset 对象上进行了迭代,该对象由 3 个值构成,并且在迭代地图内容时添加了 2 个额外的值,但所采用的 entryset 仍然指向前一个状态而不是当前状态.
  • 案例 I 呢?如果我也在同一个 entryset 对象上进行迭代,但它会打印所有 5 个值。仅当我将键(字符串)从 Fav Rap 更改为 Fav1 Rap 时,它会在显示 3 个值后终止循环,但地图的大小仍为 5。感谢您的帮助 :)
  • 这将回答您的问题stackoverflow.com/a/38473153/2633386
【解决方案2】:

ConcurrentHashMap 中的检索操作(包括 get)不会阻塞,因此可能与更新操作(包括 put(根据您的情况) 和 remove)重叠

【讨论】:

  • 感谢您的回答。如果您敏锐地看到案例 II,我正在将键从 Fav Rap(案例 I)更改为 Fav1 Rap(案例 II)。行。所以现在我同意它为 Fav1 Rap 创建了一个新对象。但是在显示为什么它只打印 3 个值时,尽管在第二种情况下大小似乎是 5。希望你能理解我的担忧。
【解决方案3】:

我认为您应该尝试重新编译您的项目。因为我在我的 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

【讨论】:

  • 哦对了!!!不过,我正在开发 Eclipse IDE。总之非常感谢。我必须弄清楚在 eclipse 上工作时出了什么问题。
  • 有帮助吗?你能通过检查我的回答和投票来帮助我获得声誉吗?哈哈。
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2023-03-29
  • 2014-03-26
  • 2023-03-20
  • 1970-01-01
  • 2019-03-19
相关资源
最近更新 更多