Рубрики
Без рубрики

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

Взгляните на различные способы сравнения строк в Java.

Автор оригинала: baeldung.

1. Обзор

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

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

2. Сравнение Строк С Классом 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();

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

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

2.2. Использование равных()

Класс String переопределяет equals () , унаследованный от объекта . Этот метод сравнивает две Строки символ за символом, игнорируя их адрес.

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

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, и string 4 равны, поскольку они имеют одинаковый регистр и значение независимо от их адреса.

Для string 3 метод возвращает false, так как он чувствителен к регистру.

Кроме того, если любая из двух строк имеет значение null , то метод возвращает 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 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 class equals () . Этот метод чувствителен к регистру, поскольку он внутренне вызывает метод String класса equals () .

Давайте проверим это:

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- связанных операций ; это также имеет некоторые очень полезные методы для String сравнения.

4.1. Использование equals() и 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 возвращает логическое значение. Это работает аналогично equals(), за исключением того, что он игнорирует регистр символов в строках :

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

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

Первый аргумент метода равен любому() является строкой , а второй-типом с несколькими аргументами CharSequence. Метод возвращает true , если какая-либо из других заданных Строк совпадает с первой строкой с учетом регистра.

В противном случае возвращается значение 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() работает аналогично методу equals Any () , но также игнорирует оболочку:

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

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

Метод compare() в StringUtils классе является null-безопасной версией compareTo() метода String класса и обрабатывает null значения, рассматривая null значение меньше, чем ненулевое значение. Два null значения считаются равными.

Кроме того, этот метод можно использовать для сортировки списка Строк с 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);

Эти два метода также можно использовать с параметром null Меньше . Это третий логический аргумент, который решает, следует ли считать значения null меньшими или нет .

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

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

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

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

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

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

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