Нужно ли переопределять метод equals(), когда я переопределяю метод CompareTo и Compare в java, чтобы удовлетворить контракт Comparable? Будет ли это создавать какие-либо проблемы, когда я делаю Collections.sort или Array.sort?Переопределение сравнения и сравнения в java7
ответ
От Comparable
:
Естественное упорядочение для класса
C
называется в соответствии с равными тогда и только тогдаe1.compareTo(e2) == 0
имеет то же логическое значение, какe1.equals(e2)
для каждогоe1
иe2
классаC
. Обратите внимание:null
не является экземпляром какого-либо класса, иe.compareTo(null)
должен выброситьNullPointerException
, хотяe.equals(null)
возвращаетfalse
.Настоятельно рекомендуется (хотя и не обязательно), чтобы естественные порядки соответствовали. Это связано с тем, что сортированные наборы (и отсортированные карты) без явных компараторов ведут себя «странно», когда они используются с элементами (или ключами), естественное упорядочение которых несовместимо с равными. В частности, такой сортированный набор (или отсортированная карта) нарушает общий контракт для множества (или карты), который определяется в терминах метода equals.
(курсив мой)
Так что вам не нужно переопределить equals()
(т.е. он не будет вызывать проблемы в стандартных методов сортировки, так как они используют только compareTo()
, а также не нарушают договор Comparable
), но это, конечно, не повредит.
Из Javadoc для Comparator
Это, как правило, имеет место, но не строго необходимо, чтобы (ср (х, у) == 0) == (x.equals (у)). Вообще говоря, любой компаратор, нарушающий это условие, должен четко указывать этот факт. Рекомендуемый язык: «Примечание: этот компаратор налагает упорядочения, которые не соответствуют равным».
Это означает, что обычно вам не нужно переопределять equals()
. Вероятно, вы не должны этого делать, если не хотите, чтобы ваш Comparator
возвращал ненулевое сравнение для двух значений, которые возвращают true
по сравнению с equals
.
Если вы считаете, что наличие сравнения требует от вас изменить определение того, что означает для двух вещей, чтобы быть равным, то вы, вероятно, разработали что-то плохое.
- 1. Переопределение операторов сравнения в Groovy
- 2. Метод сравнения нарушает его общий контракт java7
- 3. C# переопределение типа сравнения "есть"?
- 4. VS2010 Исходные данные сравнения сравнения сравнения сравнения профилей сравнения
- 5. Переопределение сравнения. Из расширенного класса - что происходит?
- 6. Ошибка сравнения сравнения
- 7. Алгоритм сравнения и сравнения круговых буферов
- 8. Инструмент сравнения и сравнения данных Postgres
- 9. , реализующий собственные методы сравнения и сравнения
- 10. Метод сравнения сравнения() сортировка путаницы
- 11. Переопределение __eq__ и __hash__ для сравнения атрибута dict двух экземпляров
- 12. Отрицательные и положительные значения возврата для сравнения и сравнения.
- 13. Слова сравнения и замены
- 14. IF и порядок сравнения
- 15. Строка Манипуляции и сравнения
- 16. Массив сравнения и замена
- 17. время строительства и сравнения
- 18. Изображение обрезки и сравнения
- 19. Хранение даты и сравнения
- 20. MySQL Сравнения и '%'
- 21. Счетные циклы и сравнения
- 22. Qt и QDateTime сравнения
- 23. HashMap и список сравнения
- 24. Qt и QDateTime сравнения
- 25. Методы сравнения и массивы
- 26. сравнения и сортировки в VHDL
- 27. Свопы и сравнения в Quicksort
- 28. Присоединение булевых значений для сравнения для сравнения
- 29. Java двойного сравнения против строки сравнения
- 30. Использование strcmp для сравнения строк и сравнения символов напрямую
, когда у меня есть несколько способов сортировки коллекции объектов, используя разные компараторы .. в таком сценарии e1.compareTo (e2) == 0 не будет таким же, как e1.equals (e2). .. В этом случае, если я использую объекты класса в качестве ключей к коллекции, это вызовет любую проблему? –
@paulb Какую коллекцию вы используете? – arshajii
Я использую ArraList .. –