【问题标题】:Values in a HashMap being overriden by the newest value (Java)HashMap 中的值被最新值覆盖(Java)
【发布时间】:2018-06-01 10:45:41
【问题描述】:
Map<Integer, Configuration> m

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

我的地图 m 本质上将 configNumber 映射到 Configuration 类。未来的 configNumber 需要来自先前 configNumber 值的信息。但是,当我在我的地图中添加一个新的 configNumber 时,第二个 Set&lt;Integer&gt;&gt; 跟在新放置的 configNumber 的 Set&lt;Integer&gt;&gt; 后面。例如:

首字母:

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

当我添加一个新键时,说 1:

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

  • 键: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&lt;Integer&gt; 会随着最近放置的内容而变化。我认为这是一个参考问题。但是每次我创建一个new HashMap&lt;&gt;() 并在访问它之前将所有值放在那里。任何提示将不胜感激。

【问题讨论】:

  • 能否提供调用map的put()方法的代码?
  • "Map&lt;Integer, Pair&lt;Set&lt;Address&gt;, Set&lt;Integer&gt;&gt;&gt;" 这种类型的签名非常糟糕。你应该考虑创建一个特定的类来代替Pair

标签: java reference hashmap


【解决方案1】:

最明显的原因是在构造第二个条目时重复使用第一个条目中的Set&lt;Integer&gt;Pair&lt;&gt;。但是没有你的代码,我们无法判断。

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

【讨论】:

    猜你喜欢
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多