Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как правильно сравнивать строки

Короткий ответ

Содержимое строк сравнивает метод 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.