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"; Не забувайте про лапки.
Ва Дим Рівень 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)){ воно може з-за цього
Ва Дим Рівень 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(); Він має викликатися ПЕРЕД лямбда виразом (умова ? перший варіант : другий варіант) Якщо хочете у цьому розібратися глибже - вчиться далі:)
Beisik Рівень 25
21 серпня 2022
Жуть а не вторая задачка )))Якщо б умова коректніше була поставлена то все б було дійсно просто )А так я думав не про те що потрібно було б з робити.І впринципі резутьльтату я добився 2 способами але вони не підходили під рішення ).Дам підказку хто буде розвязувати але не захоче лізти в підказки. ==
Ва Дим Рівень 28
4 березня 2024
Ого я таке писав 😁