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 указывают на разные объекты, содержащие одинаковый текст.



Комментарии (348)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
xpanutel Уровень 4
4 марта 2026
Like please
Кирилл Уровень 5
24 февраля 2026
Пролайкате для ачивы, пожалуйста
Анна Клушкина Уровень 13
2 января 2026
⛏ ура, задачки на практику!
Anonymous #6452357 Уровень 5
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);
    }
}
Anonymous #3397071 Уровень 4
5 сентября 2025
не знаю упоминалось ли об этом в обучении или нет но, от перестановки переменных значение одно, то есть if (x == c ) тоже самое что if (c == x)
d0vbnya Уровень 2
29 ноября 2025
это как то интуитивно понятно)
Константин Уровень 4
24 августа 2025
Это вообще - то гиперсамолёт😑
Gris Hiver Уровень 1
28 июля 2025
Java использует "пул строк" String Pool для оптимизации памяти. Это специальное место в памяти, где хранятся все строковые литералы.

String a = "hello";
String b = "hello";
System.out.println(a == b); // true — обе строки ссылаются на один объект из пула
Переменная a находится на стеке и содержит ссылку на объект "hello" в куче.
Руслан Уровень 48
12 июня 2025
Ребят если просто сравнивать ссылки через == то они будут true только в том случае если у них текс одинаковый 1 к 1 иначе false и касаемо метода toUpperCase он всегда создает новый обьект если изначально содержимое не равно 1 к 1,надеюсь понятно обьяснил😅😅
ame Уровень 4
14 июля 2025
Почему же

String text = "Привет";
String message = new String("Привет");
System.out.println(text == message); // false
Текст одинаковый, но при сравнении через "==" дает false. Дело в том, что "==" проверяет ссылки, а не содержимое. Результат TRUE при использовании "==" гарантирует, что текст одинаковый, однако если результатом будет FALSE, то это не гарантирует, что текст разный😵