Вы должны правильно переопределить метод Equals() из класса Object
Edit: Я думаю, что мой первый ответ был неправильно понят, вероятно, потому, что я был не слишком точным. Поэтому я решил добавить больше объяснений.
Почему вы должны переопределить equals()? Хорошо, потому что это в домене разработчика, чтобы решить, что означает, что для двух объектов будут равными. Для большинства случаев стандартного равенства недостаточно.
Например, представьте, что у вас есть HashMap, ключи которого имеют тип Person. У каждого человека есть имя и адрес. Теперь вы хотите найти подробный компонент, используя ключ. Проблема в том, что вы обычно не можете создать экземпляр с той же ссылкой, что и на карте. Что вы делаете, так это создать еще один экземпляр класса Person. Очевидно, оператор == не будет работать здесь, и вы должны использовать equals().
Но теперь мы приходим к другой проблеме. Представим себе, что ваша коллекция очень большая, и вы хотите выполнить поиск. Наивная реализация сравнивала бы ваш ключевой объект с каждым экземпляром на карте с помощью equals(). Это, однако, было бы очень экспансивным. И вот идет hashCode(). Как отмечали другие, hashcode - это единственный номер, который не обязательно должен быть уникальным. Важным требованием является то, что всякий раз, когда equals() дает true для двух объектов, hashCode() должен возвращать одинаковое значение для обоих из них. Обратная импликация не выполняется, что хорошо, потому что hashcode разделяет наши ключи на ведра. У нас есть небольшое количество экземпляров класса Person в одном ведре. Когда мы выполняем поиск, алгоритм может сразу перейти в правильное ведро и только теперь выполнить равный для каждого экземпляра. Поэтому реализация hashCode() должна распределять объекты как можно более равномерно по ковши.
Есть еще один момент. Некоторые коллекции требуют правильной реализации метода hashCode() в классах, которые используются как ключи не только по соображениям производительности. Примеры: HashSet и LinkedHashSet. Если они не переопределяют hashCode(), метод hashCode() объекта Object допускает несколько объектов, которые вы можете считать «значимо равными», которые будут добавлены к вашему «без дубликатов».
Некоторые из коллекций, которые используют хэш-код()
- HashSet
- LinkedHashSet
- HashMap
Взгляните на этих двух классов от Apache Commons, которые позволяют реализовать equals() и hashCode() легко
Я сделал это Google, но все примеры, которые я нашел, никогда не объясняли, что вам пришлось переопределить метод equals. –
@AndroidAddict: Так почему вы не задали этот вопрос? – 2013-04-17 20:18:01