ссылка на объект установлена в Java

Я должен создать ряд объектов. Беспокойство, я не хочу основывать хеширование или равенство на хэш-коде объектов, и равняется реализации. Вместо этого я хочу, чтобы хэш-код и равенство базировались только на ссылочных идентификационных данных каждого объекта (т.е.: значение ссылочного указателя).

Я не уверен, как сделать это в Java.

Обоснование позади этого является моими объектами, надежно не реализуют, равняется, или хэш-код, и в этих ссылочных идентификационных данных случая достаточно хорош.

13
задан Landon Kuhn 29 April 2010 в 14:43
поделиться

3 ответа

Я думаю, что 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>());
24
ответ дан 1 December 2019 в 20:56
поделиться

Вы можете расширить HashSet (или на самом деле - AbstractSet ) и поддержать его с помощью IdentityHashMap , который использует System.identityHashCode (объект) вместо obj.hashCode () .

Вы можете просто ввести в Google IdentityHashSet , некоторые реализации уже существуют. Или используйте Collections.newSetFromMap (..) , как предложил Иоахим Зауэр.

Это, конечно, следует делать только в том случае, если вы не «владеете» классами своих объектов. В противном случае просто исправьте их hashCode ()

1
ответ дан 1 December 2019 в 20:56
поделиться

Вы можете обернуть ваши объекты в класс-обертку, который затем может реализовать hashcode и equals, основываясь просто на идентификации объекта.

3
ответ дан 1 December 2019 в 20:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: