Java предоставляет несколько способов сравнения строк, каждый со своими преимуществами и недостатками. Лучший метод зависит от того, нужно ли вам регистрозависимое сравнение, проверяете ли вы на равенство или нужно определить лексикографический порядок. Это руководство разъясняет наиболее распространенные подходы.
Содержание
- Использование метода
compareTo()
- Оператор
==
- Метод
equals()
- Регистрозависимость и
equalsIgnoreCase()
- Метод
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
. Избегайте использования ==
для сравнения содержимого строк.