Коллекция с использованием равенства ссылок

#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 .