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

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

Открыта

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



Комментарии (350)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
SleepingAsya
Уровень 4
24 марта, 14:37
В предыдущей главе был пример, где после использования метода .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
Уровень 30
15 марта, 16:46
дайте лайк, пожалуйста))
xpanutel
Уровень 4
4 марта, 18:12
Like please
Кирилл
Уровень 10
24 февраля, 11:21
Пролайкате для ачивы, пожалуйста
2 января, 16:30
⛏ ура, задачки на практику!
Anonymous #6452357
Уровень 6
16 декабря 2025, 09:15
Собираю лайки для очивы
24 ноября 2025, 09:36
Работаем
24 января, 23:35
Так держать! Работаем!
koborov
Уровень 6
5 сентября 2025, 21:57
Всем привет. Мой вариант решения "Сравним строки"
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, 16:21
не знаю упоминалось ли об этом в обучении или нет но, от перестановки переменных значение одно, то есть if (x == c ) тоже самое что if (c == x)
d0vbnya
Уровень 2
29 ноября 2025, 05:42
это как то интуитивно понятно)
Константин
Уровень 4
24 августа 2025, 03:32
Это вообще - то гиперсамолёт😑