Как правильно сравнивать строки
Короткий ответ
Содержимое строк сравнивает метод equals():
void main() {
String a = "java";
String b = new String("java");
IO.println(a.equals(b));
}Результат:
trueПочему не ==
Оператор == проверяет, что это один и тот же объект в памяти, а не одинаковый текст. Строки, полученные из ввода, файла или вычислений, — разные объекты:
void main() {
String a = "java";
String b = "ja";
String c = b + "va";
IO.println(a == c);
IO.println(a.equals(c));
}Результат:
false
trueБез учёта регистра
equalsIgnoreCase() считает одинаковыми большие и маленькие буквы:
void main() {
IO.println("Yes".equalsIgnoreCase("YES"));
}Результат:
trueКогда строка может быть null
Вызов equals() у null выбрасывает исключение. Либо ставьте литерал слева, либо используйте Objects.equals():
void main() {
String input = null;
IO.println("admin".equals(input));
IO.println(Objects.equals(input, null));
}Результат:
false
trueПорядок строк
compareTo() возвращает отрицательное число, ноль или положительное число — в зависимости от того, какая строка идёт раньше по алфавиту:
void main() {
IO.println("apple".compareTo("banana") < 0);
IO.println("pear".compareTo("pear"));
IO.println("Zoo".compareTo("apple") < 0);
}Результат:
true
0
trueЗаглавные буквы идут раньше строчных, поэтому "Zoo" меньше "apple". Для сравнения без учёта регистра есть compareToIgnoreCase().
Частая ошибка
Сравнение через == иногда «работает» с литералами, потому что Java хранит одинаковые литералы в одном объекте. Но со строкой из ввода оно ломается:
void main() {
String answer = IO.readln();
IO.println(answer == "yes");
IO.println(answer.equals("yes"));
}Результат:
false
trueЗдесь пользователь ввёл yes. Всегда сравнивайте текст через equals().
Функции из этого ответа
- String.equals() — Сравнивает содержимое двух строк.
- String.equalsIgnoreCase() — Сравнивает две строки без учёта регистра букв.
- String.compareTo() — Сравнивает две строки по алфавиту (лексикографически).
- Objects.equals() — Сравнивает два объекта через equals(), безопасно для null.