gpt4 book ai didi

java - 同时向 HashMap 添加元素

转载 作者:行者123 更新时间:2023-12-01 20:14:33 25 4
gpt4 key购买 nike

如果我迭代标准 HashMap 并尝试在迭代时向其中添加元素,则会收到 ConcurrentModificationException

所以我尝试使用允许并发添加的 HashMap:

ConcurrentHashMap<String, Integer> cMap = new ConcurrentHashMap<>();
cMap.put("one", 1);
cMap.forEach((key, value) -> cMap.put(key + key, value + value));
System.out.println(cMap);

但是,生成的 map 有点奇怪:

 {oneoneoneoneoneoneoneone=8, one=1, oneone=2, oneoneoneone=4}

如果将 key 更改为 zx (cMap.put("zx", 1)),则现在的结果是:

{zxzx=2, zx=1}

问题:

1)为什么会发生这种情况?两个并发操作(迭代和添加)不应发生冲突。

2)如何解决不一致问题?

与集合相反,当在迭代该字符串的字符时更改字符串时,不会遇到此问题:

        String str = scanner.next();
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) == str.charAt(i-1)) {
str = str.substring(0, i-1) + str.substring(i+1);
i = 0;
}
}
if (str.length() == 0) {
System.out.println("Empty String");
} else {
System.out.println (str);
}
}

请注意,在上面的循环中,源字符串实际上并未更改,而是重新分配,因为字符串是不可变的且无法修改

上面的代码工作正常且一致。这是为什么字符串是线程安全的一个例子吗?

最佳答案

这取决于添加新元素的哈希桶。在您的第一个示例中,您的新元素被添加到比您正在处理的哈希桶晚的哈希桶中,并且迭代器尚未到达该哈希桶。在第二个示例中,新元素被添加到迭代器已读取的早期哈希存储桶中。

对于在迭代过程中修改集合,您应该非常小心。对于您的情况,最好将新条目添加到新 map 中,然后将它们合并在一起。

关于java - 同时向 HashMap 添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46129099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com