Значения в HashMap, переопределяемые новейшим значением (Java) - PullRequest
0 голосов
/ 01 июня 2018
Map<Integer, Configuration> m

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

Моя карта m по существу сопоставляет configNumber с классом конфигурации.Для будущего configNumber требуется информация из предыдущих значений configNumber.Тем не менее, когда я добавляю новый configNumber в мою карту, второй Set<Integer>> следует с Set<Integer>> недавно введенного configNumber.Например:

По умолчанию:

  • Ключ: 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 голосов
/ 01 июня 2018

Наиболее очевидной причиной было бы повторное использование Set<Integer> или Pair<> из первой записи при создании второй.Но без вашего кода мы не можем сказать.

Это одна из причин, по которой я выступаю за копирование при записи в публичных API;если кто-то, кого вы не знаете, предоставляет вам коллекцию, сделайте свою собственную копию перед ее хранением.(Если вы когда-нибудь начнете получать ConcurrentModificationException s, вы знаете, что вам нужно начать это делать.)

...