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

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

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

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

3
Задача
Java Syntax Pro, 3 уровень, 9 лекция
Недоступна
Сравним строки
Напиши программу, которая считывает с клавиатуры две строки и выдает сообщение о том, одинаковые ли эти строки.
3
Задача
Java Syntax Pro, 3 уровень, 9 лекция
Недоступна
Сравнение строк по ссылке
В методе main напиши код попарного сравнения по ссылке строк string1, string2 и string3 (строку string1 нужно сравнить со строкой string2, строку string2 со строкой string3 и строку string1 со строкой string3) с выводом соответствующего сообщения после каждого сравнения:

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
Задача
Java Syntax Pro, 3 уровень, 9 лекция
Недоступна
Сломанная клавиатура
Амиго создал секретное слово для доступа к закрытой информации, но у него сломалась клавиатура и теперь невозможно набирать буквы в верхнем регистре. Напиши программу, которая будет сравнивать введенную строку со строкой из переменной secret и выводить на экран сообщение "доступ разрешен", если введ

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



Комментарии (319)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
ramigo Уровень 5
1 декабря 2024
Хорошо объяснили
raswet Уровень 4
20 ноября 2024
21112024
alexjumpstav Уровень 4
13 ноября 2024
Все очень интересно, но как теперь понять, где и как это используется в большой работе? То есть в работе
Antariko Уровень 27
19 ноября 2024
Примитивная система антиплагиата, сравнение введенных данных с оригиналом (например приложение для изучения иностранного языка)
Anonymouse #3523256 Уровень 10
24 ноября 2024
Думаю, что в комиксе дан один из наиболее частых примеров использования, а именно - сравнение паролей. К ВК, ДжаваРаш и прочим сайтам, как пример
Алиакбер Уровень 7
12 ноября 2024
Что за прекрасный преподаватель в видео, у вас дар преподавания вы учитель с большой буквы! Очень круто спасибо что вы есть.
avokinda Уровень 4
15 ноября 2024
О каком видео идет речь? Это что-то для premium pro ?
Drake Уровень 7
19 ноября 2024
тоже не понял
Алексей Уровень 4
10 декабря 2024
Тут половина отзывов куплено. Такие, обычно, вне контекста, оставляют отзыв об обучении в духе "хорошо объяснили", "все понятно" и так далее. А этот коммент также оставлен ботом, план же выполнять надо.
intelectium Уровень 4
11 декабря 2024
мб речь идет о их видео на ютубе, где эти же лекции объясняются
kk Уровень 6
7 ноября 2024
Привет! Может, кому-то будет интересно, я нашла интересный метод .intern(). Он проверяет, существует ли строка и, если существует, возвращает её ссылку! Наверное, его тоже можно использовать при сравнении. Конечно, equals использовать удобнее.

public static void main(String[] args) {
         String capsMessage = "HELLO";
        String message = "Hello";
        String message2 = message.toUpperCase().intern();
        System.out.println(capsMessage == message2);
    }
Sergey Уровень 6
16 октября 2024
Дорогие друзья, всем доброго времени суток. Я прочитал и прошел все задания 3 уровня и понял, что что-то у меня не получается с этими if вложениями и тд.... Начал сам разбираться и тестировать все в IDEA проверял разные последовательности написания кода. А теперь я обращаюсь к опытным программистам все верно я понял или нет, а может быть этот пример тоже кому-нибудь поможет. Задание такое - Вводим с клавиатуры целое число (температура на улице), далее программа просит ввести солово (Солнечно, Дождь, Снег). Мы сравниваем температуру с указанием Солнечно , Дождливо или Снежно и выводим ответ. Скан прикрепил так как код получился большим.
Kidze Уровень 17
22 октября 2024
Я тоже учусь, но рабочий вариант написания веток условий вроде такой: if (условие-1) { команда-1; } else if (условие-2) { команда-2; } else if (условие-3) { команда-3; } else команда-4; }
yura Уровень 11
22 октября 2024
Как классно все оформлено)))
Zarist Уровень 6
16 января 2025
а какая у вас ошибка? в чем проблема? Возможно у вас ошибка в использовании и создании ненужного второго сканера "ss" ведь у вас уже есть "sc" и вы можете записать

String sol = sc.nextLine();
Так же лучше используйте

if (условие) {
    // 1 условие
} else if (2-е условие) {
    // 2 условие если не подошло первое и подошло 2-е
}
Zarist Уровень 6
16 января 2025

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.print("Пожалуйста введите число актуальной температуры на улице >>> ");
        Scanner scan = new Scanner(System.in); //Создание сканера

        int temperature = scan.nextInt(); //Присваиваем введённое число к переменной
        scan.nextLine(); //Не обращайте внимание, этот сканер чисто для считывания переноса строки с предыдущего сканера (((

        System.out.print("Ещё один вопрос! На улице Солнечно, Дождь, Снег? >>> ");
        String weather = scan.nextLine(); // Задаём погоду и сохраняем в переменную

        if (temperature >= 0 & temperature <= 10) { // Для лучшего понимания кода, где это возможно лучше писать условие сразу там где оно и пригождается
            if (weather.equalsIgnoreCase("Солнечно")) { // equalsIgnoreCase() для того чтобы можно было вводить в разном регистре и все работало бы коректно :)
                System.out.println("Сегодня прекрсаня погода, светит солнце, но все же ещё холодно. Стоит одеть шапку и куртку");
            } else if (weather.equalsIgnoreCase("Дождь")) {
                System.out.println("Сегодня пасмурно и идёт дождь. Лучше всего взять с собой зонтик и одешь шапку и куртку");
            } else if (weather.equalsIgnoreCase("Снег")) {
                System.out.println("ОгО и такое бывает! На улице снегопад, давай оденемся потеплее и не забудь шарф");
            }
        } // Завершение начального if 
        
        // Далее пишете тоже самое но в начальном if другие цифры
        // А вообще когда нужно сравнить что либо на соответствие конкретной вещи лучше использовать swith case ))  

    }
}
Дополнение к моему предыдущему комментарию. Все работает
Zarist Уровень 6
16 января 2025
Денис Уровень 31
9 октября 2024
Чем дальше, тем страшнее, но пока держусь.
Andrey Уровень 28
8 октября 2024
Сижу в шоке от этой вашей джавы...Дефакто главный язык разработки финтеха и гостеха🤯 Чтобы получить ввод с консоли фактически нужно сперва создать объект сканера, передать ему системный поток ввода, затем к созданному объекту сканнера применить парсер, который там под капотом видимо создаст объект-итератор (?) и у него для получения следующего значения мы несколько раз вызовем типа nextЧтотоТам(). От оно че Михалыч.. Ведь нельзя ж просто взять и так фигануть как в других языках

x, y, z = input("Введите 3 координаты через пробел", x, y, z)
...чисто философски: вот нафига эти парсеры было делить на nextLine(), nextInt(), nextDouble() если все равно нужно обрабатывать ввод а то все упадет🤯 ну все равно жеж валидацию писать🤯 Сравнение строк вообще создавали по обкурке...вот кому в жизни нужно сравнение адресов указателей - наиболее частый сценарий - сравнение значений. Вот бы и вынесли экзотику в метод .equalPointers()...чудны джавистские будни....
AlexGarag Уровень 28
26 октября 2024
Я думаю, уровень-два вверх - и ты забудешь о вводе данных с клавиатуры. Но да, Джаве свойственна некоторая "многословность". Но! Изучив Spring... )))
Andrey Уровень 28
28 октября 2024
ой..а я видел...у нас мужик показывал как он придумал писать АПИ Тесты использую аннотации Спринга...ну красиво у него получалось...прям не джаба а конфетка
ВК Уровень 36
28 ноября 2024
Думаю задача ввода чисел из консоли для программ финтеха и гостеха очень редкая) А вот задача чтения разных потоков ввода из разных источников (файлы, данные из сети и т.д.) и последующий их парсинг разными способами - частая. Потому решение сразу универсальное. P.S. А если для частной задачи вам нужен частый консольный ввод, вы же напишете свою функцию Input так как вам будет удобно?
Zarist Уровень 6
16 января 2025
лучший) хорошо разложил
3 октября 2024
как же интересно! спасибо javarush!
Aleksandra Vnukovskaya Уровень 6
20 сентября 2024
Ух, сравнение строк дается сложнее чем числа. Но все равно дико интересно. Первую задачу решила через if-else.