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

Java 为什么更改key的值会更改并发Hashmap中的输出?,java,eclipse,collections,concurrenthashmap,Java,Eclipse,Collections,Concurrenthashmap,我在EclipseIDE上使用并发HashMap时发现,在更改并发HashMap的键时,我的输出也会更改。 案例一: publicstaticvoidmain(字符串[]args){ ConcurrentHashMap ConcurrentHashMap=新的ConcurrentHashMap(); concurrentHashMap.put(“Fav Rap”、“Eminem”); concurrentHashMap.put(“Fav食品”、“比萨饼”); concurrentHashMa

我在EclipseIDE上使用并发HashMap时发现,在更改并发HashMap的键时,我的输出也会更改。
案例一:

publicstaticvoidmain(字符串[]args){
ConcurrentHashMap ConcurrentHashMap=新的ConcurrentHashMap();
concurrentHashMap.put(“Fav Rap”、“Eminem”);
concurrentHashMap.put(“Fav食品”、“比萨饼”);
concurrentHashMap.put(“流行音乐”、“杰克逊”);
for(Map.Entry:concurrentHashMap.entrySet()){
concurrentHashMap.put(“Fav游戏”、“Fifa”);
concurrentHashMap.put(“学生”、“史密斯”);
System.out.println(“键:“+entry.getKey()+”,值:“+entry.getValue()+”哈希代码:“+entry.hashcode()+”大小:“+concurrentHashMap.size()”);
}
}
输出为:

键:Pop,值:Jackson哈希代码:-172386558大小:5

关键字:Fav Rap,值:Eminem哈希代码:1491542025尺寸:5

键:学生,值:史密斯哈希代码:-1988544968尺寸:5

键:Fav游戏,值:Fifa哈希代码:1043213001大小:5

关键词:Fav食品,价值:披萨哈希代码: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());
    }

}
publicstaticvoidmain(字符串[]args){
ConcurrentHashMap ConcurrentHashMap=新的ConcurrentHashMap();
concurrentHashMap.put(“Fav1 Rap”、“Eminem”);
concurrentHashMap.put(“Fav食品”、“比萨饼”);
concurrentHashMap.put(“流行音乐”、“杰克逊”);
for(Map.Entry:concurrentHashMap.entrySet()){
concurrentHashMap.put(“Fav游戏”、“Fifa”);
concurrentHashMap.put(“学生”、“史密斯”);
System.out.println(“键:“+entry.getKey()+”,值:“+entry.getValue()+”哈希代码:“+entry.hashcode()+”大小:“+concurrentHashMap.size()”);
}
}
输出为:

键:Pop,值:Jackson哈希代码:-172386558大小:5

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

关键词:Fav食品,价值:披萨哈希代码:983035627尺码:5

我刚刚将映射的第一个键从Fav更改为Fav1,输出也随之更改。
你能澄清我的疑问吗?提前感谢:)

这就是并发哈希映射的工作方式。如果您在添加所有值后查看,输出将是相同的。在迭代过程中,您正在向其中添加项,案例行为会根据迭代器中的对象引用而变化。

ConcurrentHashMap中的检索操作(包括get)不会阻塞,因此可能会与更新操作重叠(包括put(,如您的案例中的)和删除)

我认为你应该试着重新编译你的项目。因为我在IDE中尝试了你的代码。它工作得很好。它给了我5个输出,就像案例一一样。这里是我将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

因为fav rap和fav1 rap是不同的对象。这就是为什么即使您刚刚更改了密钥的名称,它仍然会创建一个新对象fav1 rapI在代码中看不到当前条目的密钥有任何更改。您基本上只是在地图中添加了2个条目。@Mr.Aw我同意这将创建一个新的Fav1 rap对象。但是其他两个项目,即Fav游戏和学生会发生什么。虽然列表的大小似乎是5,但显示的数据数量是3。希望你能理解我的担忧。@imprezzeb如果你敏锐地看到案例二,我正在将钥匙从Fav Rap(案例一)更改为Fav1 Rap(案例二)。好啊所以现在我同意它为Fav1 Rap创建了一个新对象。但在显示为什么只打印3个值时,第二种情况下的大小似乎是5。希望你能理解我的担忧。@SumeetBarua我以为你刚刚展示了3,让我们看看hashcode中的变化。我试过你的密码。我还尝试将第一个键从Fav更改为Fav1。但是我的输出没有改变。它仍然给了我5个输出,如果你敏锐地看到在案例II中,我正在将钥匙从Fav Rap(案例I)更改为Fav1 Rap(案例II)。好啊所以现在我同意它为Fav1 Rap创建了一个新对象。但在显示为什么只打印3个值时,尽管第二种情况下贴图的大小似乎是5。希望您理解我的担忧。这是因为您对映射的entryset对象进行了迭代,该对象由3个值构成,并且在迭代映射内容时添加了2个额外值,但entryset仍然指向前一个状态,而不是当前状态。那么案例I呢?在这种情况下,我也在同一个entryset对象上迭代,但它会打印所有5个值。只有当我将键(字符串)从Fav Rap更改为Fav1 Rap时,它才会在显示3个值后终止循环,但贴图的大小仍然保持为5。感谢您的帮助:)这将回答您的问题谢谢您的回答。如果你敏锐地看到案例二,我正在将钥匙从Fav Rap(案例一)更改为Fav1 Rap(案例二)。好啊所以现在我同意它为Fav1 Rap创建了一个新对象。但在显示为什么只打印3个值时,第二种情况下的大小似乎是5。希望你能理解我的担忧。哦,是它!!!不过我当时正在开发EclipseIDE。无论如何,非常感谢。我必须在处理eclipse时找出问题所在。它有帮助吗?你能通过检查我的答案和投票来帮助我赢得声誉吗?哈哈。
   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