ссылка на объект установлена ​​в Java - PullRequest
13 голосов
/ 29 апреля 2010

Мне нужно создать набор объектов. Дело в том, что я не хочу основывать хеширование или равенство на hashCode объектов и равнозначно реализации. Вместо этого я хочу, чтобы хеш-код и равенство основывались только на ссылочной идентичности каждого объекта (т. Е. На значении ссылочного указателя).

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

Причиной этого является то, что мои объекты не могут надежно реализовать equals или hashCode, и в этом случае ссылочная идентичность достаточно хороша.

Ответы [ 3 ]

24 голосов
/ 29 апреля 2010

Я думаю, что 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, который предписывает использование метода equals при сравнении объектов. Этот класс предназначен для использования только в тех редких случаях, когда требуется семантика равенства ссылок.

edit : см. Комментарий Йоахима Сауэра ниже, действительно легко сделать Set на основе определенного Map. Вам нужно сделать что-то вроде этого:

Set<E> mySet = Collections.newSetFromMap(new IdentityHashMap<E, Boolean>());
3 голосов
/ 29 апреля 2010

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

1 голос
/ 29 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...