Сбор с использованием ссылочного равенства

На Яве можно создать 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 к.

Другие вопросы по тегам