Порівняння Рядків у Java
Свайпніть щоб показати меню
Порівняння — це та область, де Java починає поводитися трохи більш "низькорівнево", ніж очікується. Здається очевидним, що рядки можна порівнювати так само, як і числа — за допомогою ==. Адже якщо два рядки виглядають ідентично, чому б їм не бути рівними?
Проблема з ==
Якщо використовувати == з рядковими літералами, спочатку здається, що все працює правильно:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "Latte"; System.out.println(order1 == order2); } }
Обидві змінні вказують на один і той самий об'єкт у внутрішньому пулі рядків Java — коли той самий літерал з'являється знову, Java повторно використовує вже існуючий. Тому == повертає true.
А тепер трохи змінимо спосіб створення рядків:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1 == order2); } }
Використання new String() вказує Java створювати повністю окремий об'єкт щоразу — навіть якщо вміст ідентичний. Оскільки == порівнює адреси в пам'яті, а не текст, він повертає false.
Головне правило: == не аналізує текст усередині рядка — він перевіряє, чи обидві змінні вказують на той самий об'єкт у пам'яті.
equals() — Порівняння фактичного вмісту
Якщо потрібно порівняти фактичний текст усередині двох рядків, використовуйте .equals(). Цей метод повністю ігнорує пам'ять і зосереджується лише на символах:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1.equals(order2)); } }
Навіть якщо order1 і order2 — це окремі об'єкти в пам'яті, .equals() порівнює їхній вміст і повертає true.
Чутливість до регістру з equals()
Java чутлива до регістру, тому навіть одна літера з різним регістром робить рядки нерівними:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "latte"; System.out.println(order1.equals(order2)); } }
"Latte" та "latte" розглядаються як різні рядки, тому результат — false.
equalsIgnoreCase() — Порівняння без урахування регістру
Якщо потрібно порівняти рядки, ігноруючи різницю між великими та малими літерами, використовуйте .equalsIgnoreCase():
Main.java
12345678910package com.example; public class Main { public static void main(String[] args) { String order = "Latte"; System.out.println(order.equalsIgnoreCase("LATTE")); } }
.equalsIgnoreCase() розглядає "Latte" і "LATTE" як однакові та повертає true.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Порівняння Рядків у Java
Порівняння — це та область, де Java починає поводитися трохи більш "низькорівнево", ніж очікується. Здається очевидним, що рядки можна порівнювати так само, як і числа — за допомогою ==. Адже якщо два рядки виглядають ідентично, чому б їм не бути рівними?
Проблема з ==
Якщо використовувати == з рядковими літералами, спочатку здається, що все працює правильно:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "Latte"; System.out.println(order1 == order2); } }
Обидві змінні вказують на один і той самий об'єкт у внутрішньому пулі рядків Java — коли той самий літерал з'являється знову, Java повторно використовує вже існуючий. Тому == повертає true.
А тепер трохи змінимо спосіб створення рядків:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1 == order2); } }
Використання new String() вказує Java створювати повністю окремий об'єкт щоразу — навіть якщо вміст ідентичний. Оскільки == порівнює адреси в пам'яті, а не текст, він повертає false.
Головне правило: == не аналізує текст усередині рядка — він перевіряє, чи обидві змінні вказують на той самий об'єкт у пам'яті.
equals() — Порівняння фактичного вмісту
Якщо потрібно порівняти фактичний текст усередині двох рядків, використовуйте .equals(). Цей метод повністю ігнорує пам'ять і зосереджується лише на символах:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = new String("Latte"); String order2 = new String("Latte"); System.out.println(order1.equals(order2)); } }
Навіть якщо order1 і order2 — це окремі об'єкти в пам'яті, .equals() порівнює їхній вміст і повертає true.
Чутливість до регістру з equals()
Java чутлива до регістру, тому навіть одна літера з різним регістром робить рядки нерівними:
Main.java
1234567891011package com.example; public class Main { public static void main(String[] args) { String order1 = "Latte"; String order2 = "latte"; System.out.println(order1.equals(order2)); } }
"Latte" та "latte" розглядаються як різні рядки, тому результат — false.
equalsIgnoreCase() — Порівняння без урахування регістру
Якщо потрібно порівняти рядки, ігноруючи різницю між великими та малими літерами, використовуйте .equalsIgnoreCase():
Main.java
12345678910package com.example; public class Main { public static void main(String[] args) { String order = "Latte"; System.out.println(order.equalsIgnoreCase("LATTE")); } }
.equalsIgnoreCase() розглядає "Latte" і "LATTE" як однакові та повертає true.
Дякуємо за ваш відгук!