В Java можно создать HashMap
, который использует ссылочное равенство вместо метода equals()
?Сбор с использованием ссылочного равенства
ответ
Используйте IdentityHashMap
класс. Это вариант HashMap
, в котором используются ==
и System.identityHashCode()
вместо Object.equals(Object)
и Object.hashCode()
.
Обратите внимание, что этот класс преднамеренно нарушает договор API из java.util.Map
, который требует, что ключ равенство основано на equals(Object)
.
в качестве поправки, http://docs.oracle.com/javase/7/docs/api/java/util/IdentityHashMap.html – chiccodoro
Эй, ребята, что с отрешенным исступлением? –
Вы видите - я не решался редактировать, я предпочел дать вам ссылку в качестве комментария - хотя редактирование отлично o.k. в StackOverflow, и я думаю, что «ребята» не сделали ничего грубого ответа. – chiccodoro
Вы можете переопределить метод equals объектов, которые вы вставляете в HashMap, для проверки равенства ссылок.
Как и в:
public boolean equals(Object obj) {
return this == obj;
}
Класс IdentityHashmap поставляется со стандартной Java. Из JavaDoc:
Этот класс реализует интерфейс карты с помощью хеш-таблицы, используя для сравнения ключей (и значений) равенство-равенство вместо равенства объектов. Другими словами, в IdentityHashMap два ключа k1 и k2 считаются равными тогда и только тогда (k1 == k2). (В обычных реализациях Карта (как HashMap) два ключа k1 и k2 считаются равными, если и только если (k1 == NULL k2 == NULL:?. K1.equals (k2)))
Имейте в виду, что многие функции, которые принимают Map
, делают это, полагая, что они будут использовать equals
, а не ссылочное равенство. Поэтому будьте осторожны, какие функции вы передаете IdentityHashmap
.
Вы можете реализовать свои собственные :) –
Вы имеете в виду использование == для достижения равенства содержания? –
Вы говорите о равенстве самой «Карты» или ее элементов? – Paul