Sobes.tech
Junior

Šta je pool stringova u Javi?

sobes.tech АИ

Одговор од АИ

Пул стрингова (String pool) — ово је посебна област у Јавијевој хипу (heap) где се чувају стринг литерали и интернировани стрингови. Његова главна сврха је уштеда меморије кроз поновну употребу истих стринг вредности.

Како то ради:

Када се креира стринг литерал (на пример, "hello"), ЈВМ прво проверава да ли већ постоји стринг са истом вредношћу у пулу стрингова.

  • Ако стринг постоји: ЈВМ враћа референцу на већ постојећи објекат у пулу, уместо да креира нови.
  • Ако стринг не постоји: ЈВМ креира нови String објекат у пулу стрингова и враћа референцу на њега.

Креирање стрингова и пул:

  1. Помоћу стринг литерала:
    // "hello" је стринг литерал
    String s1 = "hello";
    String s2 = "hello";
    // s1 и s2 ће се односити на исти објекат у пулу стрингова
    
  2. Помоћу конструктора new String():
    String s3 = new String("world");
    String s4 = new String("world");
    // s3 и s4 ће се односити на различите објекте у хипу, чак и ако им вредност буде иста.
    // Стринг литерал "world" може бити у пулу, али објекти s3 и s4 нису.
    
  3. Метод intern():
    String s5 = new String("java");
    // Метод intern() проверава да ли постоји стринг са истом вредношћу у пулу
    String s6 = s5.intern();
    // Ако постоји, враћа референцу на објекат из пула.
    // Ако не постоји, додаје тренутни стринг у пул и враћа референцу на њега.
    

Предности пула стрингова:

  • Уштеда меморије: Смањује број дуплираних стринг објеката.
  • Повећање перформанси: Сравњење стрингова литералима (==) може бити брже него поређење објеката String помоћу equals(), ако оба операнда референцирају исти објекат у пулу.

Важно:

Поређење стрингова оператором == проверава да ли две променљиве референцирају исти објекат у меморији. За поређење садржаја стрингова увек користите метод equals().

String str1 = "abc"; // У пулу
String str2 = "abc"; // У пулу, иста референца
String str3 = new String("abc"); // Изван пула
String str4 = str3.intern(); // У пулу, иста референца као и код str1 и str2

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str3)); // true