JavaRush /Курсы /Java Syntax Pro /Сравнение строк по содержанию

Сравнение строк по содержанию

Java Syntax Pro
3 уровень , 6 лекция
Открыта

1. Сравнение строк

Это все отлично. Но вы же видите, что строки s1 и s2 фактически одинаковые – они содержат одинаковый текст. Как сказать программе, чтобы при сравнении строк она смотрела не на адреса объектов String, а на их содержимое?

Для этого в Java у типа String есть специальный метод — equals. Выглядит его вызов так:

строка1.equals(строка2)
Сравнение двух строк

Этот метод возвращает true (истина), если строки одинаковые, и false (ложь), если они не одинаковые.

Пример:

Код: Примечание
String s1 = "Привет";
String s2 = "ПРИВЕТ";
String s3 = s1.toUpperCase();

System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s2.equals(s3));
// Привет
// ПРИВЕТ
// ПРИВЕТ

false // разные
false // разные
true  // одинаковые, хотя адреса разные

Еще примеры:

Код Пояснение
"Привет".equals("ПРИВЕТ")
false
String s = "Привет";
"Привет".equals(s);
true
String s = "При";
"Привет".equals(s + "вет");
true
String s = "П";
(s + "ривет").equals(s + "ривет");
true


2. Сравнение строк без учета регистра

В последнем примере вы увидели, что сравнение "Привет".equals("ПРИВЕТ") дает false. Действительно, строки-то не равны. Хотя...

Строки, конечно, не равны, но ведь в них написано одно и то же, только размер (регистр) букв отличается. Можно ли как-нибудь их так сравнить, чтобы размер букв при этом не учитывался? Ну чтобы "Привет".equals("ПРИВЕТ") дало true?

И ответ на этот вопрос — да. В Java у типа String есть еще один специальный метод — equalsIgnoreCase. Выглядит его вызов так:

строка1.equalsIgnoreCase(строка2)

Название метода переводится как сравнить, игнорируя регистр. В названии метода есть две вертикальные линии: первая — это L маленькая, а вторая — это i, только большая. Не перепутайте.

Пример:

Код: Примечание
String s1 = "Привет";
String s2 = "ПРИВЕТ";
String s3 = s1.toUpperCase();

System.out.println(s1.equalsIgnoreCase(s2));
System.out.println(s1.equalsIgnoreCase(s3));
System.out.println(s2.equalsIgnoreCase(s3));  
// Привет
// ПРИВЕТ
// ПРИВЕТ

true
true
true


3. Пример сравнения строк

Приведем только один простой пример: нужно ввести с клавиатуры две строки и определить, одинаковые они, или нет. Вот как будет выглядеть этот код:

Scanner console = new Scanner(System.in);
String a = console.nextLine();
String b = console.nextLine();
String result = a.equals(b) ? "Одинаковые" : "Разные";
System.out.println(result);

4. Интересный нюанс сравнения строк

Есть один важный нюанс, о котором вам нужно знать.

Если Java-компилятор в вашем коде (именно в коде) найдет несколько одинаковых строк, для экономии памяти он создаст для них только один объект.

String text = "Это очень важное сообщение";
String message = "Это очень важное сообщение";

А вот что в результате будет в памяти:

Сравнение строк по содержанию

И если в данном случае вы сравните между собой text == message, получите true. Так что не удивляйтесь.

А если вам вдруг очень нужно, чтобы ссылки были разные, вы можете написать так:

String text = "Это очень важное сообщение";
String message = new String ("Это очень важное сообщение");

Или так:

String text = "Это очень важное сообщение";
String message = new String (text);

В обоих этих случаях переменные text и message указывают на разные объекты, содержащие одинаковый текст.



Комментарии (352)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Костя Уровень 7
15 мая 2026
дайте лайк для ачивки пж
12 мая 2026
Обожаю JavaRush за подробные объяснения тем, но частенько бывает и перебор: ... "В названии метода есть две вертикальные линии: первая — это L маленькая, а вторая — это i, только большая. Не перепутайте..." )))
SleepingAsya Уровень 1
24 марта 2026
В предыдущей главе был пример, где после использования метода .toUpperCase ссылки у переменных были разные, не смотря на идентичное содержание

String text = "Привет";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase(); 
System.out.println(text == message); //true
System.out.println(s1 == s2); //false
В данной главе я вижу, что компилятор создаёт одну ссылку для экономии памяти, если текст идентичен. И в итоге то, пример из прошлой главы некорректный или ссылки в данном примере не могут быть одинаковыми из-за использования метода .toUpperCase? Почему при использовании метода .toUpperCase не используется String Pool?
Vladislav Barkhanov Уровень 31
15 марта 2026
дайте лайк, пожалуйста))
Anonymous #6463865 Уровень 7
4 марта 2026
Like please
Кирилл Уровень 10
24 февраля 2026
Пролайкате для ачивы, пожалуйста
Anna Klushkina Уровень 61
2 января 2026
⛏ ура, задачки на практику!
Anonymous #6452357 Уровень 6
16 декабря 2025
Собираю лайки для очивы
Роман Зарубин Уровень 8
24 ноября 2025
Работаем
24 января 2026
Так держать! Работаем!
koborov Уровень 6
5 сентября 2025
Всем привет. Мой вариант решения "Сравним строки"

Scanner scanner = new Scanner (System.in);
        String s1 = scanner.nextLine();
        String s2 = scanner.nextLine();
        System.out.println(s1.equals(s2) ? "строки одинаковые":"строки разные");
Мой вариант решения "Сравнение строк по ссылке"

    public static void main(String[] args) {
        String same = "ссылки на строки одинаковые";
        String different = "ссылки на строки разные";
        System.out.println(string1 == string2 ? same : different);
        System.out.println(string2 == string3 ? same : different);
        System.out.println(string1 == string3 ? same : different);
    }
Мой вариант решения "Сломанная клавиатура"

public class Solution {
    public static String secret = "AmIGo";
    public static final String any = "доступ разрешен";
    public static final String deny = "доступ запрещен";
    public static void main(String[] args) {
        Scanner scanner = new Scanner (System.in);
        String sword = scanner.nextLine();
        System.out.println(secret.equalsIgnoreCase(sword) ? any : deny);
    }
}