Сравнение строк в Java

Сравнение строк в Java

1. обзор

В этой статье мы поговорим о различных способах сравненияStrings в Java.

ПосколькуString - один из наиболее часто используемых типов данных в Java, это, естественно, очень часто используемая операция.

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

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

Использование оператора «==» для сравнения текстовых значений является одной из самых распространенных ошибок, которые делают новички в Java. Это неверно, потому что“==” only checks the referential equality of two Strings, означает, ссылаются ли они на один и тот же объект или нет.

Давайте посмотрим на пример такого поведения:

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();

В приведенном выше примере первое утверждение верно, потому что две переменные указывают на один и тот же литералString.

С другой стороны, второе утверждение неверно, потому чтоstring1 создается с помощью литерала, аstring3 создается с помощью оператораnew - поэтому они ссылаются на разные объекты.

2.2. Используяequals()

КлассString переопределяетequals(), унаследованный отObject.This method compares two Strings character by character, ignoring their address.

Он считает их равными, если они имеют одинаковую длину и символы расположены в одном порядке:

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,, поскольку он чувствителен к регистру.

Кроме того, если любая из двух строк равнаnull, метод возвращаетfalse.

2.3. ИспользуяequalsIgnoreCase()

МетодequalsIgnoreCase() возвращает логическое значение. Как следует из названия, этот методignores casing in characters while comparing Strings:

String string1 = "using equals ignore case";
String string2 = "USING EQUALS IGNORE CASE";

assertThat(string1.equalsIgnoreCase(string2)).isTrue();

2.4. ИспользуяcompareTo()

МетодcompareTo() возвращает значение типаint иcompares two Strings character by character lexicographically на основе словаря или естественного порядка.

Этот метод возвращает 0, если дваStrings равны или если оба являются отрицательными числамиnull,a, если первый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. String Сравнение с классомObjects

Objects - служебный класс, который содержит статический методequals(), полезный в этом сценарии - для сравнения двухStrings.

Метод возвращаетtrue, если дваStrings равныfirstcomparing them using their address, т.е. «==”. Следовательно, если оба аргумента -null, он возвращаетtrue, а если ровно один аргумент -null, он возвращает false.

В противном случае он просто вызывает методequals() класса типа переданного аргумента, которым в нашем случае является методString’s classequals(). В этом методе учитывается регистр, поскольку он вызывает метод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. String Сравнение сApache Commons

The Apache Commons library contains a utility class called StringUtils for String-related operations; у этого также есть несколько очень полезных методов для сравненияString.

4.1. Используяequals() and equalsIgnoreCase ()

Методequals() классаStringUtils - это расширенная версия методаString класса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 возвращает значениеboolean. Это работает аналогично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, если какой-либо из других заданныхStrings соответствует против первого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 ()

Методcompare() в классеStringUtils является методомnull-safe version of the compareTo() классаString и обрабатывает значенияnull с помощьюconsidering a null value less than a non-null value. двух значенийnull считаются равными.

Кроме того, этот метод можно использовать для сортировки спискаStrings с записямиnull:

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);

МетодcompareIgnoreCase() ведет себя аналогично, за исключением того, что игнорирует регистр:

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

Эти два метода также можно использовать с опциейnullIsLess. Этоa third boolean argument which decides if null values should be considered less or not.

Значениеnull ниже, чем значение другогоString, еслиnullIsLess истинно, и больше, еслиnullIsLess ложно.

Давай попробуем:

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

МетодcompareIgnoreCase() с третьим аргументомboolean работает аналогично, за исключением игнорирования регистра.

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

В этом кратком руководстве мы обсудили различные способы сравненияStrings.

И, как всегда, исходный код примеров можно найтиover on GitHub.