Java Programming

Сравнение строк в Java: Полное руководство

Spread the love

Java предоставляет несколько способов сравнения строк, каждый со своими преимуществами и недостатками. Лучший метод зависит от того, нужно ли вам регистрозависимое сравнение, проверяете ли вы на равенство или нужно определить лексикографический порядок. Это руководство разъясняет наиболее распространенные подходы.

Содержание

  1. Использование метода compareTo()
  2. Оператор ==
  3. Метод equals()
  4. Регистрозависимость и equalsIgnoreCase()
  5. Метод contentEquals()

1. Сравнение строк с помощью compareTo()

Метод compareTo() предлагает лексикографическое сравнение. Он возвращает:

  • 0: Если строки равны.
  • Отрицательное значение: Если вызывающая строка предшествует строке-аргументу лексикографически.
  • Положительное значение: Если вызывающая строка следует за строкой-аргументом лексикографически.

Это сравнение регистрозависимое; прописные буквы предшествуют строчным буквам.


String str1 = "apple";
String str2 = "banana";
String str3 = "Apple";

int result1 = str1.compareTo(str2); // result1 будет отрицательным
int result2 = str1.compareTo(str3); // result2 будет отрицательным (регистрозависимое)
int result3 = str1.compareTo("apple"); // result3 будет 0

2. Оператор ==

Оператор == сравнивает ссылки, а не содержимое строк. Он проверяет, указывают ли две строковые переменные на одно и то же место в памяти. Это обычно нежелательное поведение для сравнения значений строк.


String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");

System.out.println(str1 == str2); // Часто true из-за интернирования строк
System.out.println(str1 == str3); // false (разные объекты)

Хотя str1 == str2 часто возвращает true из-за интернирования строк в Java, полагаться на это ненадежно. Всегда используйте equals() для сравнения содержимого.

3. Метод equals()

Метод equals() является рекомендуемым подходом для сравнения содержимого строк. Он сравнивает символы, игнорируя местоположения в памяти.


String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");

System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true

4. Регистрозависимость и equalsIgnoreCase()

equals() регистрозависимый. «hello» и «Hello» считаются различными. Для регистронезависимого сравнения используйте equalsIgnoreCase().


String str1 = "hello";
String str2 = "Hello";

System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true

5. Метод contentEquals()

contentEquals() похож на equals(), но позволяет сравнивать String с другими объектами CharSequence (например, StringBuffer или StringBuilder).


String str1 = "hello";
StringBuffer str2 = new StringBuffer("hello");

System.out.println(str1.contentEquals(str2)); // true

Это обеспечивает гибкость, но для простых сравнений строк с строками equals() предпочтительнее для читаемости.

В заключение, выберите подходящий метод в зависимости от ваших потребностей: compareTo() для лексикографического порядка, equals() для регистрозависимого равенства содержимого, equalsIgnoreCase() для регистронезависимого равенства и contentEquals() для сравнения строк с другими объектами CharSequence. Избегайте использования == для сравнения содержимого строк.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *