Я должен создать ряд объектов. Беспокойство, я не хочу основывать хеширование или равенство на хэш-коде объектов, и равняется реализации. Вместо этого я хочу, чтобы хэш-код и равенство базировались только на ссылочных идентификационных данных каждого объекта (т.е.: значение ссылочного указателя).
Я не уверен, как сделать это в Java.
Обоснование позади этого является моими объектами, надежно не реализуют, равняется, или хэш-код, и в этих ссылочных идентификационных данных случая достаточно хорош.
Я думаю, что java.util.IdentityHashMap
- это то, что вы ищете (обратите внимание, здесь нет IdentityHashSet
). Посмотрите документацию по API:
Этот класс реализует интерфейс
Map
с хеш-таблицей, используя равенство ссылок вместо равенства объектов при сравнении ключей (и значений). Другими словами, вIdentityHashMap
два ключаk1
иk2
считаются равными тогда и только тогда, когда(k1 == k2)
. (В обычных реализацияхMap
(например,HashMap
) два ключаk1
иk2
считаются равными тогда и только тогда, когда(k1 == null? k2 == null: k1.equals (k2))
.)Этот класс не является универсальной реализацией
Map
! Хотя этот класс реализует интерфейсMap
, он намеренно нарушает общий договорMap
, который требует использования методаравно
при сравнении объектов. Этот класс предназначен для использования только в тех редких случаях, когда требуется семантика равенства ссылок.
править : См. Комментарий Иоахима Зауэра ниже, очень легко создать Набор
на основе определенной Карты
. Вам нужно будет сделать что-то вроде этого:
Set<E> mySet = Collections.newSetFromMap(new IdentityHashMap<E, Boolean>());
Вы можете расширить HashSet
(или на самом деле - AbstractSet
) и поддержать его с помощью IdentityHashMap
, который использует System.identityHashCode (объект)
вместо obj.hashCode ()
.
Вы можете просто ввести в Google IdentityHashSet
, некоторые реализации уже существуют. Или используйте Collections.newSetFromMap (..)
, как предложил Иоахим Зауэр.
Это, конечно, следует делать только в том случае, если вы не «владеете» классами своих объектов. В противном случае просто исправьте их hashCode ()
Вы можете обернуть ваши объекты в класс-обертку, который затем может реализовать hashcode
и equals
, основываясь просто на идентификации объекта.