Понимание HashMap и IdentityHashMap - PullRequest
1 голос
/ 16 ноября 2011

Я создаю 3 объекта одного класса: A, B, rB. Здесь rB относится к B. И значения A и B равны. У меня есть переопределенный метод equals, где я сравниваю значения.

Так

A.equals (B), A.equals (rB) и B.equals (rB) верно. Но A! = B, A! = рБ и В == рБ.

Теперь я помещаю A, B, rB в HashMap, скажем, hm, и IdentityHashMap, скажем, ihm.

    hm.put(A, "1");
    hm.put(B, "2");
    hm.put(rB, "3");

    ihm.put(A, "1");
    ihm.put(B, "2");
    ihm.put(rB, "3");

Так как я не храню ноль, поэтому hm.get(A) должен возвращать 3, hm.get(B) должен возвращать 3 и hm.get(rB) должен возвращать 3. Точно так же ihm.get(A) должен вернуть 1, ihm.get(B) должен вернуть 3 и ihm.get(rB) должен вернуть 3.

Согласно документам Java, IdentityHashMap выполняет k1 == k2, в то время как HashMap выполняет k1.equals (k2), если k1 и k2 не равны нулю.

Так почему hm.get(A) возвращает 1.

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Вы говорите, что вы отвергли equals, но вы также переопределили hashCode? Если нет, то это может быть причиной поведения, которое вы видите.

HashMap будет использовать equals только когда два ключа имеют одинаковый хэш-код, поэтому важно, чтобы при переопределении equals вы также переопределяли hashCode и наоборот.

0 голосов
/ 16 ноября 2011

Как вы сказали выше, A! = B, поэтому в IdentityHashMap A и B не рассматриваются как одно и то же. Вы поставили A со значением 1, а B со значением 2 (которое затем переопределяется на rB с 3). Результат такой же, как и ожидалось.

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