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