Junior
Šta je pool stringova u Javi?
sobes.tech АИ
Одговор од АИ
Пул стрингова (String pool) — ово је посебна област у Јавијевој хипу (heap) где се чувају стринг литерали и интернировани стрингови. Његова главна сврха је уштеда меморије кроз поновну употребу истих стринг вредности.
Како то ради:
Када се креира стринг литерал (на пример, "hello"), ЈВМ прво проверава да ли већ постоји стринг са истом вредношћу у пулу стрингова.
- Ако стринг постоји: ЈВМ враћа референцу на већ постојећи објекат у пулу, уместо да креира нови.
- Ако стринг не постоји: ЈВМ креира нови
Stringобјекат у пулу стрингова и враћа референцу на њега.
Креирање стрингова и пул:
- Помоћу стринг литерала:
// "hello" је стринг литерал String s1 = "hello"; String s2 = "hello"; // s1 и s2 ће се односити на исти објекат у пулу стрингова - Помоћу конструктора
new String():String s3 = new String("world"); String s4 = new String("world"); // s3 и s4 ће се односити на различите објекте у хипу, чак и ако им вредност буде иста. // Стринг литерал "world" може бити у пулу, али објекти s3 и s4 нису. - Метод
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