Сравнение строк с равными и compareTo-что быстрее?
Мне нужно сравнить 2 Strings. У меня есть следующие методы, которые я мог бы придумать:
equalsIgnoreCase- слышал, что это самый быстрый, но я не могу использовать его, так как моя строка чувствительна к регистру
matches- Вероятно, самый медленныйequalscompareTo
Таким образом, в приведенном выше варианте я остаюсь с
equals и compareTo. Какая из них быстрее среди этих?Примечание: входное число строк огромно [около 5000 в секунду].
8 ответов:
Обратите внимание на очень важное различие между
compareToи ещеequals:"myString".compareTo(null); //Throws java.lang.NullPointerException "myString".equals(null); //Returns falseТеперь я советую вам просмотреть исходный код обоих методов, чтобы сделать вывод, что
equalsпредпочтительнее, чемcompareTo, Что включает в себя некоторыеMathрасчеты.Также обратите внимание, что
equalsделает==первым! Это может быть большим преимуществом, когда объекты идентичны. Особенно когда вы упомянули, что у вас есть огромное количество строк, потому что Java interns Strings, это может случиться больше, чем ты думал.
Хотя вы спросили о строках, но я хочу добавить эту заметку:
Эти методы могут быть очень разными, когда речь идет оBigDecimal. Например, смотрите docs :Equals сравнивает этот BigDecimal с указанным объектом для равенства. В отличие от compareTo , этот метод рассматривает два больших десятичных объекта равными только если они равны по величине и масштабу (таким образом, 2.0 не равно 2.00 когда сравнивается по этому методу).
И то и другое служит разным целям.Я остаюсь с равными и compareTo.
CompareToЗначение 0, если строка аргумента равна этой строке; значение меньше 0, если эта строка лексикографически меньше аргумента строки; и значение больше 0, если эта строка лексикографически больше аргумента строки.
Где как
equalsTrue, если данный объект представляет строку, эквивалентную этой строке, ложь в противном случае
Следовательно,
compareTo()требуется больше вычислений, чемequals()Вы можете увидеть доказательство этого в исходном коде обоих.
Равные() ----- предпочитаю пользоваться этим.
EqualsIgnoreCase
Обычно вы используете его для сравнения строк.
Совпадения
Медленно, потому что он основан на регулярных выражениях.
Равно
Я не думаю, что это медленнее, чем
equalsIgnoreCaseCompareTo
Возвращает целое число или 0. Это используется, например, при сортировке. Не используйте его для равенства.
2 основных различия заключаются в том, что:
equals will take any Object as a parameter, but compareTo will only take Strings. equals only tells you whether they're equal or not, but compareTo gives information on how the Strings compare lexicographically.И это url кода класса http://www.docjar.com/html/api/java/lang/String.java.html . Вы также можете посмотреть на этот пост, если хотите Java Strings: compareTo () vs equals()
равные -
1 - переопределите метод GetHashCode, чтобы тип мог корректно работать в хэш-таблице.
2 - Не создавайте исключение при реализации метода Equals. Вместо этого верните false для аргумента null.
3-
Последовательные вызовы x. Equals (y) возвращают одно и то же значение до тех пор, пока объект, на который ссылаются x и y, не изменяется.x.Equals(x) returns true. x.Equals(y) returns the same value as y.Equals(x). (x.Equals(y) && y.Equals(z)) returns true if and only if x.Equals(z) returns true.x.Equals(null) returns false.4-для некоторых видов объектов желательно иметь равный тест для ценностного равенства вместо референтного равенства. Такие реализации Equals возвращают true, если два объекта имеют одинаковое значение, даже если они не являются одним экземпляром.
Например -
Object obj1 = new Object(); Object obj2 = new Object(); Console.WriteLine(obj1.Equals(obj2)); obj1 = obj2; Console.WriteLine(obj1.Equals(obj2));Вывод : -
False TrueПока компарето -
Сравнивает текущий экземпляр с другим объектом того же типа и возвращает целое число, указывающее, предшествует ли текущий экземпляр, следует ли за ним или встречается в той же позиции в сортировке порядок как другой объект.
Он возвращает -
Меньше нуля-этот экземпляр предшествует obj в порядке сортировки. Ноль-этот экземпляр находится в той же позиции в порядке сортировки, что и obj. Больше нуля-этот экземпляр следует за obj в порядке сортировки.
Он может вызвать исключение ArgumentException, если объект не имеет того же типа, что и экземпляр.
Например, вы можете посетить здесь.
Так что я предлагаю лучше использовать равно на месте сравнениедля.
Вы можете сами рассчитать время кода и посмотреть, что быстрее:
final long start = System.currentTimeMillis(); for (int i = 0; i < input.length; i++) { // Do comparison here } final long end = System.currentTimeMillis(); System.out.println("Time to execute: " + (end - start));
s1.CompareTo(s2)0-оба равны
+ve-чем s2 лексикографически ниже, чем s1
- ve-чем s2 лексикографически выше, чем s1
s1.equals(Object o1)True-если s1 и o1 равны
False-если s1 и o1 не равны
compareToможет броситьClassCastException, ноequals, если s1 и o1-разные классы, чем должен возвращать false.
TreeMapзависит отcompareTo(), аHashMapзависит отequals(). Так что если вы равны и compareTo не являются последовательными, чемTreeMapиHashMapмогут вести себя по-разному. Следовательно, хорошо иметь равные () и compareTo (), совместимые друг с другом, но это не обязательно.
Я думаю, что лучший или эффективный способ сравнить строку-это ссылаться на сравнение (но вы должны были использовать
literalsво всем своем коде). Потому что string по своей сути неизменяемый и String class реализует FlyWeight шаблон внутри методомintern()или компилятором. Так что хорошо сравнивать ссылка.Если вы не уверены в литералах в коде, чем вы можете сделать оптимизацию:
s1.hashCode() == s2.hashCode() && s1.equals(s2)Это потому, что строка в неизменяемом.
EqualsIgnoreCase-слышал, что это самый быстрый
Определенно нет. Он должен делать вещи, чтобы продвинуть нижний регистр к верхнему или наоборот. Вы не можете "слышать" это где-либо в авторитетном месте.
Совпадения-вероятно, самый медленный
Согласен.
Нет никаких оснований ожидать разницы между ними.Равно compareTo
Comments