HashMap говорит, что ключ не существует, хотя он и существует - PullRequest
6 голосов
/ 14 мая 2011

Я столкнулся с интересной проблемой, которая, я уверен, является ошибкой HashMap.Рассмотрим следующий отладочный код (AMap - это HashMap, ключ - это значение, передаваемое этому методу)

System.out.println("getBValues - Given: " + key);
System.out.println("getBValues - Contains Key: " + AMap.containsKey(key));
System.out.println("getBValues - Value: " + AMap.get(key));
for(Map.Entry<A,HashSet<B>> entry : AMap.entrySet()) {
    System.out.println("getBValues(key) - Equal: " + (key.equals(entry.getKey())));
    System.out.println("getBValues(key) - HashCode Equal: "+(key.hashCode() == entry.getKey().hashCode()));
    System.out.println("getBValues(key) - Key: " + entry.getKey());
    System.out.println("getBValues(key) - Value: " + entry.getValue());
}

Теперь в этой карте я вставляю один ключ (канал) и значение.Позже я пытаюсь вернуть значение с помощью get() и запустить этот код отладки, который в моем случае выдает следующее:

getBValues - Given: Channel(...)
getBValues - Contains Key: false <--- Doesnt contain key?!
getBValues - Value: null   <--- Null (bad)
getBValues(key) - Equal: true <--- Given key and AMap key is equal
getBValues(key) - HashCode Equal: true
getBValues(key) - Key: Channel(Same...)
getBValues(key) - Value: []    <--- Not null (This is the expected result)

Как вы можете видеть, получение ключа непосредственно из HashMap не работаетно, перебирая, я получаю точно такой же ключ, то есть его там просто невозможно найти с get().Мой вопрос: что может быть причиной этого?Как get() не может найти ключ, который существует?

Я приведу пример кода, но не могу воспроизвести его независимо.

Любые предложения о том, что может быть причиной этого?

Ответы [ 2 ]

8 голосов
/ 14 мая 2011

Могу поспорить, что вы не переопределяете equals и hashCode правильно в своем ключевом классе Channel.Это объясняет это.

Джошуа Блох рассказывает вам, как это сделать правильно, в своей главе «Эффективная Java». Глава 3.

http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf

4 голосов
/ 14 мая 2011

Из того, что я вижу, мы все еще не исключаем, имеет ли это отношение к неизменности.Если вы сделаете:

aMap.put(key, value);
key.setFieldIncludedInHashCodeAndEquals(25);

, вы получите результат сверху.

Чтобы исключить это, покажите нам больше вашего кода или в цикле for в приведенном выше примере., добавьте

System.out.println(aMap.get(entry.getKey()));

Также используйте отладчик.Таким образом, вы можете увидеть, находится ли ваш объект в правильном ведре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...