java.lang.Comparable и равно - PullRequest
       19

java.lang.Comparable и равно

24 голосов
/ 07 августа 2011

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

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

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

Ответы [ 4 ]

28 голосов
/ 07 августа 2011

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

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

7 голосов
/ 07 августа 2011

Из Javadoc java.lang. Сопоставимый :

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

5 голосов
/ 07 августа 2011

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

Просто посмотрите на BigDecimal API: http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#equals(java.lang.Object)

1 голос
/ 22 июня 2013

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

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

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

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

a.compareTo(b) != 0

хотя

a.equals(b) == true
...