compareTo () по сравнению с равняется ()

При тестировании на равенство Stringв Java я всегда использовал equals() потому что мне это, кажется, самый естественный метод для него. В конце концов, его имя уже говорит, что оно предназначается, чтобы сделать. Однако мой коллега недавно сказал мне, преподавался использовать compareTo() == 0 вместо equals(). Это чувствует себя неестественным (как compareTo() предназначен, чтобы обеспечить упорядочивание и не выдержать сравнение для равенства) и даже несколько опасный (потому что compareTo() == 0 не обязательно подразумевает равенство во всех случаях, даже при том, что я знаю, что оно делает для String) мне.

Он не знал, почему ему преподавали использовать compareTo() вместо equals() для Stringи я не мог также найти причину почему. Это - действительно вопрос персонального вкуса или является там какой-либо настоящей причиной для любого метода?

113
задан Micha Wiedenmann 27 October 2019 в 07:18
поделиться

5 ответов

Разница в том, что «foo» .equals ((String) null) возвращает false, а «foo» .compareTo ((String) null) == 0 вызывает исключение NullPointerException. Поэтому они не всегда взаимозаменяемы даже для струнных.

100
ответ дан 24 November 2019 в 02:42
поделиться

Похоже, что оба метода в значительной степени делают одно и то же, но метод compareTo () принимает String, а не Object, и добавляет некоторые дополнительные функции поверх обычного equals () метод. Если все, что вас волнует, - это равенство, тогда метод equals () - лучший выбор просто потому, что он имеет больше смысла для следующего программиста, который взглянет на ваш код. Разница во времени между двумя разными функциями не должна иметь значения, если вы не перебираете огромное количество элементов. CompareTo () действительно полезен, когда вам нужно знать порядок строк в коллекции или когда вам нужно знать разницу в длине между строками, которые начинаются с одной и той же последовательности символов.

источник: http: //java.sun.com/javase/6/docs/api/java/lang/String. html

5
ответ дан 24 November 2019 в 02:42
поделиться

Два основных отличия заключаются в том, что:

  1. equals принимает любой объект в качестве параметра, но compareTo принимает только строки.
  2. equals только сообщает вам, равны они или нет, но compareTo дает информацию о лексикографическом сравнении строк.

Я взглянул на код класса String , и алгоритм в compareTo и equals выглядит в основном одинаково. Я считаю, что его мнение было всего лишь вопросом вкуса, и я согласен с вами - если все, что вам нужно знать, это равенство строк, а не то, какая из них идет первой лексикографически, то я бы использовал равняется .

28
ответ дан 24 November 2019 в 02:42
поделиться

compareTo должен выполнить больше работы, если строки имеют разную длину. equals может просто вернуть false, а compareTo всегда должен проверять достаточное количество символов, чтобы определить порядок сортировки.

17
ответ дан 24 November 2019 в 02:42
поделиться

При сравнении на равенство вы должны использовать equals () , потому что он ясно выражает ваше намерение.

compareTo () имеет дополнительный недостаток что он работает только с объектами, реализующими интерфейс Comparable .

Это применимо в целом, а не только для строк.

26
ответ дан 24 November 2019 в 02:42
поделиться
Другие вопросы по тегам:

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