Java HashSet позволяет простофилям; проблема с сопоставимым?

У меня есть класс, "Аккумулятор", который реализует Сопоставимый compareTo метод, и я пытаюсь поместить эти объекты в HashSet.

Когда я добавляю () к HashSet, я не вижу действия в своем compareTo методе в отладчике, независимо от того, где я установил свои точки останова. Кроме того, когда я, покончили добавление () s, я вижу несколько дубликатов в Наборе.

Что является мной завинчивающий, здесь; почему это не Выдерживает сравнение, и поэтому, позволяя простофилям?

Спасибо,
Мститель IVR

9
задан IVR Avenger 2 June 2010 в 20:28
поделиться

6 ответов

В чем я ошибаюсь?

HashSet основан на hashCode () , а не на compareTo () . Вы можете спутать его с TreeSet . В обоих случаях не забудьте также реализовать equals () способом, совместимым с другим методом.

17
ответ дан 4 December 2019 в 06:14
поделиться

Вам необходимо правильно реализовать hashCode () и equals () .

Вы должны переопределить hashCode и вернуть число на основе значений в вашем классе, чтобы любые два равных объекта имели одинаковый хэш-код.

11
ответ дан 4 December 2019 в 06:14
поделиться

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

Ваш отладчик не нарушает работу compareTo () , потому что он никогда не используется с HashSet !

Правила следующие:

  1. Если два объекта равны, то их хэш-коды должен быть равен .

  2. Но если хеш-коды двух объектов равны, то это не означает объекты равны! Возможно что два объекта просто имеют один и тот же хеш.

6
ответ дан 4 December 2019 в 06:14
поделиться

Когда hashCode возвращает разные значения для двух объектов, то equal не используется. Кстати, compareTo не имеет никакого отношения к хэшированию коллекций :), но к сортировке коллекций

2
ответ дан 4 December 2019 в 06:14
поделиться

Ваши объекты Comparable , и, вероятно, вы также реализовали equals () , но HashSets имеют дело с хэшами объектов, и, скорее всего, у вас нет » t реализован hashCode () (или ваша реализация hashCode () не возвращает один и тот же хеш для двух объектов, которые являются (a.equals (b) == true ) .

2
ответ дан 4 December 2019 в 06:14
поделиться

HashSet использует hashCode и equals. TreeSet использует интерфейс Comparable. Примечание: если вы решите переопределить либо hashcode, либо equals, вы всегда должны переопределять другой.

1
ответ дан 4 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: