JavaRush /Курси /Java Syntax Zero /Порівняння рядків за змістом

Порівняння рядків за змістом

Java Syntax Zero
Рівень 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


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 вказують на різні об'єкти, що містять однаковий текст.

Коментарі (33)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Владислав Рівень 1
23 травня 2025
Сидів над задачею з порівнянням рядків 5 днів... Глянув на рішення бо вже тупо не зміг зрушити далі. Виконав тернарним оператором менше писанини та буде хоч відрізнятись від рішення.
Anonymous #3477999 Рівень 4
23 серпня 2024
1) if (string1 == string2) { System.out.println(same); } else { System.out.println(different); } 2) String a = string1 == string2? same : different; в чому різниця?? 1 варіант проходить, 2-ні
IronMan57 Рівень 28
17 листопада 2024
А в другому варіанті у вас виведення результату на екран передбачене?
Дмитро Рівень 4 Expert
20 травня 2024
Абсолютно не розумію як робити задачі....
Ivan Kravets Рівень 22
19 листопада 2023
до другої задачі обовязково при кожній умові виводиться повідомлення або true або false
Anonymous #3312433 Рівень 5
31 серпня 2023
"Назва методу перекладається як порівняти, ігноруючи регістр. У назві методу є дві вертикальні лінії: перша — це L маленька, а друга — це i, тільки велика. Не переплутайте." 😁😂🤣
30 серпня 2023
Часто так буває в мене, що код працює, а умова не виконана.
15 жовтня 2023
Перевірка чутлива до регістру
Vlad Рівень 17
7 серпня 2023
String one = string1.equals(string2) ? same : different; String two = string2.equals(string3) ? same : different; String three = string1.equals(string3) ? same : different; Вчому помилка ?
Anonymous #3334729 Рівень 6
28 серпня 2023
String one = string1.equals(string2) ? "same" : "different"; String two = string2.equals(string3) ? same" : different"; String three = string1.equals(string3) ? same" : different"; Не забувайте про лапки.
hidden #3421731 Рівень 28
4 березня 2024
ніяких лапок.То назва змінної.Діло в тому як він порівнює.Потрібно порівняти не текст а адресу до тексту
29 вересня 2022
Друзья в чем принципиальная разница этого кода?

if (string1==string2){
         System.out.println(same);   
    }else{
        System.out.println(different);}
и этого кода:

if ((string1)==(string2)){
         System.out.println(same);   
    }else{
        System.out.println(different);}
Мне выдавало ошибку пока скобки не убрала, хотя код запускался....
SoFar Away Рівень 7
6 листопада 2022
Дослівно то виглядає так як пояснювалося раніше в лекціях , що якщо берете окремо так званий вираз в дужки то символ порівняння буде відноситися лише до першого значення тобто в Вашому випадку до string 1 , а після дорівнює програма вже не бачить наступного виразу
les_yeux_blancs Рівень 50
17 квітня 2023
насправді конкретно в цьому кейсі різниці немає взагалі дужки потрібні для тої ж мети, що й у математиці: для керування послідовністю виконання команд, наприклад, у випадку, коли вам потрібно спочатку додати числа, а потім помножити результат на інше число
tterribaess Рівень 6
31 січня 2024
1. if (string1==string2){ в другому написано 1. if ((string1)==(string2)){ воно може з-за цього
hidden #3421731 Рівень 28
4 березня 2024
Ну ти мощь ))
Polyhedal Рівень 3
2 вересня 2022
string1.equals(string2) ? System.out.println(same) : System.out.println(different); string1.equals(string3) ? System.out.println(same) : System.out.println(different); string2.equals(string3) ? System.out.println(same) : System.out.println(different); Блин,вижу что до логики компуктера мне еще далеко, но разве вторая задача не может быть решена так?
George Рівень 7
3 вересня 2022
Можна скоротать System.out.println(string1.equals(string2) ? same : different); equals сравнивает то что внутри ссылки а не саму ссылку. допустим есть куча вкартир с номером 29 но разных домах equals сравнивает номера квартир без их адрессов, == сравнивает то в каком доме этот номер квартиры, тоесть сравнивает ище и адрес дома.
Pan Vitali Moroz Рівень 51
6 вересня 2022
println треба винести, дублювання коду це пагано
Roma Chernesh Рівень 16
21 листопада 2022
System.out.println( string1.equals(string2) ? same : different); Просто поки запам'ятайте, що у тернарному операторі не викликається метод System.out.println(); Він має викликатися ПЕРЕД лямбда виразом (умова ? перший варіант : другий варіант) Якщо хочете у цьому розібратися глибже - вчиться далі:)
hidden #3143523 Рівень 25
21 серпня 2022
Жуть а не вторая задачка )))Якщо б умова коректніше була поставлена то все б було дійсно просто )А так я думав не про те що потрібно було б з робити.І впринципі резутьльтату я добився 2 способами але вони не підходили під рішення ).Дам підказку хто буде розвязувати але не захоче лізти в підказки. ==
hidden #3421731 Рівень 28
4 березня 2024
Ого я таке писав 😁