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<>()并将所有值放在这里之前,都要访问它。任何提示将不胜感激。

最佳答案

最明显的原因是在构造第二个条目时重新使用第一个条目的Set<Integer>Pair<>。但是,如果没有您的代码,我们将无法分辨。

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

10-05 23:43