HashMap中的值被最新值(Java)覆盖

时间:2018-06-01 10:45:42

标签: java reference hashmap

Map<Integer, Configuration> m

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

我的地图m实际上将configNumber映射到Configuration类。将来的configNumber需要来自先前configNumber值的信息。但是,当我在地图中添加新的configNumber时,第二个Set<Integer>>跟随新放置的configNumber的Set<Integer>>。例如:

初​​始:

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

1 个答案:

答案 0 :(得分:0)

最明显的原因是在构建第二个条目时会重复使用第一个条目中的Set<Integer>Pair<>。但是没有你的代码,我们无法分辨。

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