Сравняване на низове в Java

1. Общ преглед

В тази статия ще говорим за различните начини за сравняване на низове в Java.

Тъй като String е един от най-използваните типове данни в Java, това естествено е много често използвана операция.

2. String сравнение с String клас

2.1. Използване на оператор за сравнение “==”

Използването на оператора “==” за сравняване на текстови стойности е една от най-често срещаните грешки, които Java начинаещите правят. Това е неправилно, защото “==” проверява само референтното равенство на два низа , което означава дали те се позовават на един и същ обект или не.

Нека да видим пример за това поведение:

String string1 = "using comparison operator"; String string2 = "using comparison operator"; String string3 = new String("using comparison operator"); assertThat(string1 == string2).isTrue(); assertThat(string1 == string3).isFalse();

В горния пример първото твърдение е вярно, защото двете променливи сочат към един и същ Stral литерал.

От друга страна, второто твърдение е невярно, тъй като string1 се създава с литерал и string3 се създава с помощта на новия оператор - следователно те се позовават на различни обекти.

2.2. Използване на equals ()

Класът String замества equals (), наследени от Object. Този метод сравнява два символа от низове по знак, пренебрегвайки адреса им.

Счита ги за равни, ако са с еднаква дължина и знаците са в същия ред:

String string1 = "using equals method"; String string2 = "using equals method"; String string3 = "using EQUALS method"; String string4 = new String("using equals method"); assertThat(string1.equals(string2)).isTrue(); assertThat(string1.equals(string4)).isTrue(); assertThat(string1.equals(null)).isFalse(); assertThat(string1.equals(string3)).isFalse();

В този пример променливите string1 , string2 и string4 са равни, тъй като имат един и същ регистър и стойност, независимо от адреса им.

За string3 методът връща false, тъй като е чувствителен към малки и големи букви.

Също така, ако някой от двата низа е нула , тогава методът връща false.

2.3. Използване на equalsIgnoreCase ()

Методът equalsIgnoreCase () връща булева стойност. Както подсказва името, този метод игнорира малки букви в символи, докато сравнява низовете :

String string1 = "using equals ignore case"; String string2 = "USING EQUALS IGNORE CASE"; assertThat(string1.equalsIgnoreCase(string2)).isTrue();

2.4. Използване на compareTo ()

Методът compareTo () връща стойност от тип int и сравнява два символа от низове по знак лексикографски въз основа на речник или естествено подреждане.

Този метод връща 0, ако два низа са равни или ако и двата са нула, отрицателно число, ако първият String идва преди аргумента, и число, по-голямо от нула, ако първият String идва след аргумента String.

Да видим пример:

String author = "author"; String book = "book"; String duplicateBook = "book"; assertThat(author.compareTo(book)) .isEqualTo(-1); assertThat(book.compareTo(author)) .isEqualTo(1); assertThat(duplicateBook.compareTo(book)) .isEqualTo(0);

2.5. Използване на compareToIgnoreCase ()

В compareToIgnoreCase () е подобен на предишния метод, с изключение на това игнорира случай:

String author = "Author"; String book = "book"; String duplicateBook = "BOOK"; assertThat(author.compareToIgnoreCase(book)) .isEqualTo(-1); assertThat(book.compareToIgnoreCase(author)) .isEqualTo(1); assertThat(duplicateBook.compareToIgnoreCase(book)) .isEqualTo(0);

3. Сравнение на низове с клас обекти

Objects е полезен клас, който съдържа статичен метод equals () , полезен в този сценарий - за сравняване на два низа.

Методът връща true, ако два низа са равни, като първо ги сравнява, използвайки техния адрес, т.е. “ ==” . Следователно, ако и двата аргумента са null , той връща true и ако точно един аргумент е null , той връща false.

В противен случай той просто извиква метода equals () на класа на типа на предадения аргумент - който в нашия случай е методът на String клас equals () . Този метод е чувствителен към регистъра, тъй като вътрешно извиква метода на equals () на String .

Нека тестваме това:

String string1 = "using objects equals"; String string2 = "using objects equals"; String string3 = new String("using objects equals"); assertThat(Objects.equals(string1, string2)).isTrue(); assertThat(Objects.equals(string1, string3)).isTrue(); assertThat(Objects.equals(null, null)).isTrue(); assertThat(Objects.equals(null, string1)).isFalse();

4. Сравнение на низове с Apache Commons

Библиотеката Apache Commons съдържа полезен клас, наречен StringUtils за операции , свързани със String ; това също има някои много полезни методи за сравнение на низове .

4.1. Използване на equals () и equalsIgnoreCase ()

Методът equals () от клас StringUtils е подобрена версия на метода String class equals (), който също обработва нулеви стойности:

assertThat(StringUtils.equals(null, null)) .isTrue(); assertThat(StringUtils.equals(null, "equals method")) .isFalse(); assertThat(StringUtils.equals("equals method", "equals method")) .isTrue(); assertThat(StringUtils.equals("equals method", "EQUALS METHOD")) .isFalse();

Методът equalsIgnoreCase () на StringUtils връща булева стойност. Това работи подобно на equals (), с изключение на това , че игнорира разделителните знаци в Strings:

assertThat(StringUtils.equalsIgnoreCase("equals method", "equals method")) .isTrue(); assertThat(StringUtils.equalsIgnoreCase("equals method", "EQUALS METHOD")) .isTrue();

4.2. Използване на equalsAny () и equalsAnyIgnoreCase ()

В equalsAny () първи аргумент методът е на String , а вторият е мулти-аргументи тип CharSequence. Методът връща true, ако някой от другите дадени низове чувствително съвпада с първия случай на String .

В противен случай се връща false:

assertThat(StringUtils.equalsAny(null, null, null)) .isTrue(); assertThat(StringUtils.equalsAny("equals any", "equals any", "any")) .isTrue(); assertThat(StringUtils.equalsAny("equals any", null, "equals any")) .isTrue(); assertThat(StringUtils.equalsAny(null, "equals", "any")) .isFalse(); assertThat(StringUtils.equalsAny("equals any", "EQUALS ANY", "ANY")) .isFalse();

Методът equalsAnyIgnoreCase () работи подобно на метода equalsAny () , но също така игнорира кожуха:

assertThat(StringUtils.equalsAnyIgnoreCase("ignore case", "IGNORE CASE", "any")).isTrue();

4.3. Използване на compare () и compareIgnoreCase ()

The compare() method in StringUtils class is a null-safe version of the compareTo() method of String class and handles null values by considering a null value less than a non-null value. Two null values are considered equal.

Furthermore, this method can be used to sort a list of Strings with null entries:

assertThat(StringUtils.compare(null, null)) .isEqualTo(0); assertThat(StringUtils.compare(null, "abc")) .isEqualTo(-1); assertThat(StringUtils.compare("abc", "bbc")) .isEqualTo(-1); assertThat(StringUtils.compare("bbc", "abc")) .isEqualTo(1);

The compareIgnoreCase() method behaves similarly, except it ignores casing:

assertThat(StringUtils.compareIgnoreCase("Abc", "bbc")) .isEqualTo(-1); assertThat(StringUtils.compareIgnoreCase("bbc", "ABC")) .isEqualTo(1); assertThat(StringUtils.compareIgnoreCase("abc", "ABC")) .isEqualTo(0);

Двата метода могат да се използват и с опция nullIsLess . Това е трета булев аргумент, който решава дали нулеви стойности следва да се счита за по-малко или не .

А нулева стойност е по-ниска от друг String ако nullIsLess е вярно и по-висока, ако nullIsLess е невярно.

Нека го изпробваме:

assertThat(StringUtils.compare(null, "abc", true)) .isEqualTo(-1); assertThat(StringUtils.compare(null, "abc", false)) .isEqualTo(1);

Методът compareIgnoreCase () с трети булев аргумент работи по подобен начин, освен чрез игнориране на регистъра.

5. Заключение

В този бърз урок обсъдихме различни начини за сравняване на низове.

И както винаги, изходният код за примерите може да бъде намерен в GitHub.