#java #collections #set
Вопрос:
В Java можно ли создать HashMap
, который использует равенство ссылок (т. Е. ==
) вместо equals()
метода?
Ответ №1:
Используйте IdentityHashMap
класс. Это вариант HashMap
, в котором ==
и System.identityHashCode()
используются вместо Object.equals(Object)
и Object.hashCode()
.
Обратите внимание, что этот класс намеренно нарушает контракт API java.util.Map
, для которого требуется, чтобы равенство ключей основывалось на equals(Object)
.
Ответ №2:
Вы можете переопределить метод equals для объектов, которые вы вставляете в хэш-карту, чтобы проверить равенство ссылок.
Как в:
public boolean equals(Object obj) {
return this == obj;
}
Ответ №3:
Класс IdentityHashMap поставляется со стандартной Java. Из Джавадока:
Этот класс реализует интерфейс карты с хэш-таблицей, используя равенство ссылок вместо равенства объектов при сравнении ключей (и значений). Другими словами, в карте идентификации два ключа k1 и k2 считаются равными тогда и только тогда, когда (k1==k2). (В реализациях обычной карты (например, HashMap) два ключа k1 и k2 считаются равными тогда и только тогда, когда (k1==null ? k2==ноль : k1.равно(k2)).)
Имейте в виду , что многие функции, которые принимают Map
s, делают это, предполагая, что они будут использовать equals
, а не ссылаться на равенство. Поэтому будьте осторожны, какие функции вы передаете своим IdentityHashmap
.