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

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

Відкрита

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 Zero,  3 рівень,  9 лекція
Недоступна
Порівняймо рядки
Порівняймо рядки
3
Задача
Java Syntax Zero,  3 рівень,  9 лекція
Недоступна
Порівняння рядків за посиланням
Порівняння рядків за посиланням

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 Zero,  3 рівень,  9 лекція
Недоступна
Поламана клавіатура
Поламана клавіатура

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

Коментарі (35)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
serhii
Рівень 23
30 серпня, 09:21
в третій задачі можна використати метод класу String equalsIgnoreCase()
serhii
Рівень 23
30 серпня, 09:16
System.out.println((string1 == string2) ? same : different); System.out.println((string2 == string3) ? same : different); System.out.println((string1 == string3) ? same : different);
Владислав
Рівень 1
23 травня 2025, 09:34
Сидів над задачею з порівнянням рядків 5 днів... Глянув на рішення бо вже тупо не зміг зрушити далі. Виконав тернарним оператором менше писанини та буде хоч відрізнятись від рішення.
Anonymous #3477999
Рівень 4
23 серпня 2024, 11:34
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, 18:24
А в другому варіанті у вас виведення результату на екран передбачене?
Дмитро
Рівень 4
Expert
20 травня 2024, 11:10
Абсолютно не розумію як робити задачі....
Ivan Kravets старший механік в ImperyMotors
19 листопада 2023, 12:10
до другої задачі обовязково при кожній умові виводиться повідомлення або true або false
Anonymous #3312433
Рівень 5
31 серпня 2023, 12:50
"Назва методу перекладається як порівняти, ігноруючи регістр. У назві методу є дві вертикальні лінії: перша — це L маленька, а друга — це i, тільки велика. Не переплутайте." 😁😂🤣
30 серпня 2023, 12:13
Часто так буває в мене, що код працює, а умова не виконана.
15 жовтня 2023, 17:28
Перевірка чутлива до регістру
Vlad
Рівень 17
7 серпня 2023, 10:33
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, 10:35
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, 16:33
ніяких лапок.То назва змінної.Діло в тому як він порівнює.Потрібно порівняти не текст а адресу до тексту
29 вересня 2022, 09:01
Друзья в чем принципиальная разница этого кода?
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, 14:12
Дослівно то виглядає так як пояснювалося раніше в лекціях , що якщо берете окремо так званий вираз в дужки то символ порівняння буде відноситися лише до першого значення тобто в Вашому випадку до string 1 , а після дорівнює програма вже не бачить наступного виразу
les_yeux_blancs QA Automation Engineer
17 квітня 2023, 10:59
насправді конкретно в цьому кейсі різниці немає взагалі дужки потрібні для тої ж мети, що й у математиці: для керування послідовністю виконання команд, наприклад, у випадку, коли вам потрібно спочатку додати числа, а потім помножити результат на інше число
tterribaess
Рівень 6
31 січня 2024, 12:36
1. if (string1==string2){ в другому написано 1. if ((string1)==(string2)){ воно може з-за цього
hidden #3421731
Рівень 28
4 березня 2024, 16:35
Ну ти мощь ))