2010-10-12 2 views
0

Можно создать дубликат:
Overriding equals and hashCode in JavaПереопределение равно() и хэш-код() в Java

Все,

Я определил мой класс и для переопределения равна() и hashCode(). Но я не знаю, что конкретно эти методы должны быть реализованы для моего собственного класса. Может ли кто-нибудь пролить свет на реализацию этих методов для пользовательских классов?

+0

Это на самом деле зависит от того, как вы определяете равенства. Часто нужно учитывать все или почти все атрибуты, иногда только один/несколько, а иногда (например, темы Threads), все, что вы хотите в методе equals(), - это сравнивать личность. – helpermethod

ответ

9

Вы говорите, что уже знаете, какой из ваших пользовательских классов необходимо переопределить hashCode/equals? Затем вы также знаете, какие атрибуты (глобальные переменные) определяют равенство каждого класса.

Если вы знаете эти атрибуты, вы можете реализовать hashCode/equals либо вручную, либо путем создания методов с использованием современной среды IDE, такой как Eclipse, NetBeans и т. Д. В Eclipse есть опция «Генерировать hashCode() и equals()», в меню «Источник»

alt text

2
+0

Этот ответ является ссылкой на страницу IBM, которая возвращает страницу 503. Как вы думаете, вы могли бы обновить свой ответ, чтобы включить соответствующую информацию, а не просто ссылку? – 2014-08-11 11:19:05

+0

@MichaelT Эта ссылка по-прежнему активна .... –

3

Для равных, ответ зависит от того, что ваш бизнес-потребность есть, то что это значит для ваших объектов, чтобы быть равными.

hashCode() должен всегда возвращать уникальное значение для объекта, если только этот объект не равен другому объекту. Он должен зависеть от значений свойств вашего объекта.

+1

Самое главное, hashCode() must * not * возвращает разные значения для объектов, где equals() возвращает true –

+0

@michael хорошая точка, редактирование ответа .. – hvgotcodes

+0

Он не всегда может вернуться уникальное значение. Легче всего зависеть от тех же свойств, что и 'equals'. – Ishtar

2

В принципе, если вы хотите сохранить объект в коллекции (Map, Set, List), то вы должны реализовать методы equals и hashCode в соответствии с контрактом, определенным в документации.

В противном случае многие реализации коллекции не будут иметь ожидаемого поведения. Для подсказок реализации прочитайте объект Javadoc для equals и hashcode.

+0

Только * keys * в хеше следует правильно определить хэш-код. Я могу хранить объекты Froboz в HashMap без переопределения методов 'equals()' или 'hashCode()', если я использую, скажем, 'String' в качестве ключа, а с String -' equals () 'и' hashCode() 'уже правильно определены. – jbindel

+0

Правда. Но http://download.oracle.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object) не удастся. –

1

Прочтите документацию API по двум методам в java.lang.Object. Он описывает очень именно тем, как должны себя вести переопределяющие реализации.

1

При внедрении equals() убедитесь, что вы понимаете разницу между равенством и идентичностью. Два экземпляра объекта могут быть «равными», но могут не совпадать. a.equals (b) - это тест на равенство, которое должны определяться вашими бизнес-правилами. == - это тест для идентификации объекта (тот же экземпляр объекта)

Смежные вопросы