У Java рядки є одним із найбільш поширених типів даних. Однак є тонкі, але важливі відмінності між створенням рядків за допомогою прямого присвоєння та ключового слова new
. Розуміння цих відмінностей є ключовим для написання ефективного та продуктивного коду в Java. Давайте розглянемо це детальніше.
Пряме присвоєння
Коли ви створюєте рядок за допомогою прямого присвоєння, наприклад:
String str1 = "Hello";
String str2 = "Hello";
Як це працює
Пул рядків (String Pool): Java має спеціальну область пам'яті, яка називається Пул рядків (String Pool), що зберігає літерали рядків. Коли ви присвоюєте рядок безпосередньо, JVM спочатку перевіряє, чи існує вже такий самий рядок у пулі.
- Якщо рядок існує, повертається посилання на існуючий рядок.
- Якщо рядок не існує, створюється новий об'єкт рядка в пулі.
Ефективне використання пам'яті: Цей механізм запобігає дублюванню рядків та оптимізує використання пам'яті.
Приклад
У наведеному коді обидва str1
та str2
посилаються на один і той самий об'єкт у пулі рядків:
System.out.println(str1 == str2); // Виводить: true
Це тому, що str1
та str2
вказують на одне й те ж місце в пам'яті.
Використання new String()
Коли ви створюєте рядок за допомогою ключового слова new
, як от:
String str1 = new String("Hello");
String str2 = new String("Hello");
Як це працює
Пам'ять купи (Heap Memory): Ключове слово new
завжди створює новий об'єкт рядка в пам'яті купи, навіть якщо такий самий рядок вже існує в пулі.
Посилання на пул рядків (String Pool Reference): Хоча вміст ("Hello"
) зберігається в пулі рядків, об'єкти, створені за допомогою new
, є незалежними і зберігаються в купі.
Приклад
У цьому випадку str1
та str2
— це різні об'єкти, навіть якщо їх значення однакове:
System.out.println(str1 == str2); // Виводить: false
System.out.println(str1.equals(str2)); // Виводить: true
Тут ==
порівнює посилання на пам'ять (які різні), а .equals()
перевіряє вміст (який однаковий).
Основні відмінності
Практичні рекомендації
Використовуйте пряме присвоєння, коли:
- Ви хочете скористатися перевагами пулу рядків.
- Значення рядків є сталими або часто використовуються у вашій програмі.
Використовуйте new String()
коли:
- Вам потрібно створити новий об'єкт, який є незалежним від існуючих рядків у пулі.
- Ви працюєте з API або в ситуаціях, де необхідно мати різні об'єкти (наприклад, для тестування рівності посилань).
Приклади коду для кращого розуміння
Пряме присвоєння
String s1 = "Java";
String s2 = "Java";
System.out.println(s1 == s2); // true, одне й те ж посилання
Використання new String()
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2); // false, різні посилання
System.out.println(s1.equals(s2)); // true, однаковий вміст
Висновок
Розуміння різниці між прямим присвоєнням рядка та new String()
допоможе вам писати більш ефективні програми на Java. Пряме присвоєння є ефективним з точки зору пам'яті та використовує пул рядків, тоді як new String()
гарантує унікальність об'єктів, але має додаткові витрати на пам'ять. Використовуйте ці методи з розумінням в залежності від вашого конкретного випадку.
Оволодівши цими тонкощами, ви зможете оптимізувати свій код і приймати кращі дизайнерські рішення для своїх Java-проєктів. Успіхів у програмуванні!
Перекладено з: Understanding the Difference Between String Assignment and new String() in Java