java - HashMap 中的值被新值覆盖 (Java)

标签 java reference hashmap

Map<Integer, Configuration> m

Configuration {
    int configNumber;
    Map<Integer, Pair<Set<Address>, Set<Integer>>> groupInfo;
}

我的映射 m 本质上将 configNumber 映射到 Configuration 类。 future 的 configNumber 需要来自先前 configNumber 值的信息。但是,当我在 map 中添加新的 configNumber 时,第二个 Set<Integer>>接下来是 Set<Integer>>新放置的 configNumber。例如:

初始:

  • key :0 ,值:Configuration(configNum=0, groupInfo={1=([server3, server2, server1],[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])})

当我添加新 key 时,请说 1:

  • key :0 ,值:Configuration(configNum=0, groupInfo={1=([server3, server2, server1],[6, 7, 8, 9, 10])})

  • key :1 ,值:Configuration(configNum=1, groupInfo={1=([server3, server2, server1],[6, 7, 8, 9, 10]), 2=([server6, server5, server4],[1, 2, 3, 4, 5])})

如您所见,键0是的Set<Integer>这对中的内容随最近放置的内容而变化。我以为这是一个引用的问题。但每次我创建 new HashMap<>()并在访问它之前将所有值放在那里。任何提示将不胜感激。

最佳答案

最明显的原因是重复使用 Set<Integer>Pair<>构建第二个条目时从第一个条目开始。但如果没有您的代码,我们无法判断。

这是我提倡在公共(public) API 中进行写时复制的原因之一;如果您不认识的人向您提供 Collection ,请在存储之前制作自己的副本。 (如果您开始收到 ConcurrentModificationException ,您就知道您需要开始这样做。)

关于java - HashMap 中的值被新值覆盖 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50641718/

相关文章:

java - isEventDispatchThread 超出 EDT 但从 EventDispatchThread.run 运行

java - Hibernate 中 DTO 和延迟加载之间有什么关系

reference - (OCaml)queue.ml 中使用了奇怪的语法—— `<-` 运算符

perl - 传递函数对象并调用它

c# - 如何在 Java 中执行 GUI 任务

java - 如何在桌面应用程序启动时创建介绍性 Logo ?

c# - 来自另一个解决方案的引用项目

java - Java中的ConcurrentHashMap和Hashtable

java - 从不同的类访问 HashMap

java - 如何迭代速度模板中的嵌套 map ?