Переопределение HashCode, если мне не нужно переопределять, равно - PullRequest
4 голосов
/ 29 июля 2011

У меня есть собственный класс с именем Position.Я хочу использовать следующее: -

Set<Position> s=new HashSet<Position>();

Нужно ли переопределять метод HashCode () в классе Position?Я не переопределил метод equals ().Я хочу, чтобы два объекта Position считались равными, только если они являются одним и тем же объектом.Нужно ли мне переопределять HashCode (), чтобы использовать HashSet, как показано выше?

Ответы [ 3 ]

4 голосов
/ 29 июля 2011

Вам нужно переопределить hashcode и equals, если вы хотите, чтобы разные объекты (предположительно представляющие одну и ту же вещь) считались равными.

(Чтобы уточнить, если вы переопределяете одно, вы должны переопределить другое, чтобы объекты, которые тестируются как равные, всегда имели одинаковый хэш-код.)

1 голос
/ 29 июля 2011

Да!Перезапись одного из двух, но не другого, является очень плохим стилем и создаст тонкие ошибки, которые трудно отладить.Существует контракт, который задокументирован в JavaDoc объекта [1], и этот контракт следует соблюдать в ваших собственных интересах.Если вы хотите узнать больше об этом, прочитайте пункт 7 очень хорошей книги «Эффективная Java» [2].

Редактировать: Извините, я неправильно прочитал.Если вы не перезаписываете одну из них, вам не нужно ничего делать.Тем не менее, прочитайте пункт в книге.Это всегда хорошая идея, чтобы реализовать оба этих метода.

0 голосов
/ 30 июля 2011

Если вы использовали Map, то существует специальный класс IdentityHashMap, который создается специально для этой цели, т.е. использует равенство ссылок вместо равенства объектов при сравнении ключей.

...