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