Подтвердить что ты не робот

Java.lang.Comparable и equals

Если я реализую java.lang.Comparable для класса, мне еще нужно переопределить метод equals()? Или работает Comparable для equals?

Если ответ нет, то что, если возникает какое-то несоответствие? Скажем, как я называю два объекта равными в методе equals(), отличается от того, как я называю два объекта одного и того же класса равными в compareTo() Comparable.

Кроме того, если я реализую Comparable, мне также нужно переопределить equals()?

4b9b3361

Ответ 1

Хотя рекомендуется (и довольно разумно), что наличие a.compareTo(b) == 0 означает, что a.equals(b) (и наоборот), это не требуется. Comparable предназначен для использования при выполнении заказа по ряду объектов, тогда как equals() просто проверяет прямое равенство.

Эта ссылка содержит правильную информацию об использовании compareTo.

Ответ 2

Из Javadoc java.lang.Comparable:

Настоятельно рекомендуется (хотя и не обязательно), чтобы естественные порядки были согласованы с равными.

Ответ 4

Скажем, как я называю два объекта равными в пределах equals() метод отличается от того, как я называю два объекта одного класса как равный внутри toCompare() сравнимого?

Если вы сделаете это, и вы поместите эти объекты в отсортированный набор, набор будет ошибочным. Из документов на SortedSet:

Обратите внимание, что упорядочение, поддерживаемое сортированным набором (независимо от того, явный компаратор) должен быть согласован с равными, если сортированный набор - это правильно реализовать интерфейс Set.

Например, TreeSet может (ошибочно) содержать два объекта, в которых

a.compareTo(b) != 0

хотя

a.equals(b) == true