При тестировании на равенство String
в Java я всегда использовал equals()
потому что мне это, кажется, самый естественный метод для него. В конце концов, его имя уже говорит, что оно предназначается, чтобы сделать. Однако мой коллега недавно сказал мне, преподавался использовать compareTo() == 0
вместо equals()
. Это чувствует себя неестественным (как compareTo()
предназначен, чтобы обеспечить упорядочивание и не выдержать сравнение для равенства) и даже несколько опасный (потому что compareTo() == 0
не обязательно подразумевает равенство во всех случаях, даже при том, что я знаю, что оно делает для String
) мне.
Он не знал, почему ему преподавали использовать compareTo()
вместо equals()
для String
и я не мог также найти причину почему. Это - действительно вопрос персонального вкуса или является там какой-либо настоящей причиной для любого метода?
Разница в том, что «foo» .equals ((String) null)
возвращает false, а «foo» .compareTo ((String) null) == 0
вызывает исключение NullPointerException. Поэтому они не всегда взаимозаменяемы даже для струнных.
Похоже, что оба метода в значительной степени делают одно и то же, но метод compareTo () принимает String, а не Object, и добавляет некоторые дополнительные функции поверх обычного equals () метод. Если все, что вас волнует, - это равенство, тогда метод equals () - лучший выбор просто потому, что он имеет больше смысла для следующего программиста, который взглянет на ваш код. Разница во времени между двумя разными функциями не должна иметь значения, если вы не перебираете огромное количество элементов. CompareTo () действительно полезен, когда вам нужно знать порядок строк в коллекции или когда вам нужно знать разницу в длине между строками, которые начинаются с одной и той же последовательности символов.
источник: http: //java.sun.com/javase/6/docs/api/java/lang/String. html
Два основных отличия заключаются в том, что:
equals
принимает любой объект в качестве параметра, но compareTo
принимает только строки. equals
только сообщает вам, равны они или нет, но compareTo
дает информацию о лексикографическом сравнении строк. Я взглянул на код класса String , и алгоритм в compareTo и equals выглядит в основном одинаково. Я считаю, что его мнение было всего лишь вопросом вкуса, и я согласен с вами - если все, что вам нужно знать, это равенство строк, а не то, какая из них идет первой лексикографически, то я бы использовал равняется
.
compareTo
должен выполнить больше работы, если строки имеют разную длину. equals
может просто вернуть false, а compareTo
всегда должен проверять достаточное количество символов, чтобы определить порядок сортировки.
При сравнении на равенство вы должны использовать equals ()
, потому что он ясно выражает ваше намерение.
compareTo ()
имеет дополнительный недостаток что он работает только с объектами, реализующими интерфейс Comparable
.
Это применимо в целом, а не только для строк.