Розуміння різниці між присвоєнням рядка та new String() у Java

У 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() перевіряє вміст (який однаковий).

Основні відмінності

pic

Практичні рекомендації

Використовуйте пряме присвоєння, коли:

  • Ви хочете скористатися перевагами пулу рядків.
  • Значення рядків є сталими або часто використовуються у вашій програмі.

Використовуйте 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

Leave a Reply

Your email address will not be published. Required fields are marked *