У меня есть класс, "Аккумулятор", который реализует Сопоставимый compareTo метод, и я пытаюсь поместить эти объекты в HashSet.
Когда я добавляю () к HashSet, я не вижу действия в своем compareTo методе в отладчике, независимо от того, где я установил свои точки останова. Кроме того, когда я, покончили добавление () s, я вижу несколько дубликатов в Наборе.
Что является мной завинчивающий, здесь; почему это не Выдерживает сравнение, и поэтому, позволяя простофилям?
Спасибо,
Мститель IVR
В чем я ошибаюсь?
HashSet основан на hashCode ()
, а не на compareTo ()
. Вы можете спутать его с TreeSet
. В обоих случаях не забудьте также реализовать equals ()
способом, совместимым с другим методом.
Вам необходимо правильно реализовать hashCode ()
и equals ()
.
Вы должны переопределить hashCode
и вернуть число на основе значений в вашем классе, чтобы любые два равных объекта имели одинаковый хэш-код.
HashSet использует методы hashCode ()
и equals ()
для предотвращения добавления дубликатов. Во-первых, он получает хэш-код объекта, который вы хотите добавить. Затем он находит соответствующий сегмент для этого хэш-кода и перебирает каждый объект в этом сегменте, используя метод equals ()
, чтобы увидеть, существуют ли какие-либо идентичные объекты в наборе.
Ваш отладчик не нарушает работу compareTo ()
, потому что он никогда не используется с HashSet
!
Правила следующие:
Если два объекта равны, то их хэш-коды должен быть равен .
Но если хеш-коды двух объектов равны, то это не означает объекты равны! Возможно что два объекта просто имеют один и тот же хеш.
Когда hashCode возвращает разные значения для двух объектов, то equal не используется. Кстати, compareTo не имеет никакого отношения к хэшированию коллекций :), но к сортировке коллекций
Ваши объекты Comparable
, и, вероятно, вы также реализовали equals ()
, но HashSets
имеют дело с хэшами объектов, и, скорее всего, у вас нет » t реализован hashCode ()
(или ваша реализация hashCode ()
не возвращает один и тот же хеш для двух объектов, которые являются (a.equals (b) == true )
.
HashSet использует hashCode и equals. TreeSet использует интерфейс Comparable. Примечание: если вы решите переопределить либо hashcode, либо equals, вы всегда должны переопределять другой.