Sobes.tech
Junior

Aký je rozdiel medzi vytvorením reťazca pomocou new String() a použitím literálu reťazca?

sobes.tech AI

Odpoveď od AI

Pri použití literálu reťazca ("abc"), sa reťazec vytvorí v Pooli reťazcov (String Pool). Ak už v poole existuje reťazec s rovnakou hodnotou, vráti sa odkaz na existujúci objekt. Ide o optimalizáciu na úsporu pamäte.

Pri použití new String("abc") sa vždy vytvorí nový objekt reťazca na halde (heap), aj keď v poole už existuje reťazec s rovnakou hodnotou.

Príklad:

// Vytvorí sa literál reťazca "hello". Ak v poole ešte nie je, pridá sa.
// str1 odkazuje na objekt v poole.
String str1 = "hello";

// Opätovné použitie literálu "hello". Keďže je už v poole,
// str2 tiež odkazuje na ten istý objekt v poole ako str1.
String str2 = "hello";

// Vytvorí sa nový objekt reťazca s hodnotou "hello" na halde.
// str3 odkazuje na tento nový objekt na halde, nie na objekt v poole.
String str3 = new String("hello");

// Kontrola odkazov:
// str1 a str2 odkazujú na ten istý objekt v poole.
System.out.println(str1 == str2); // true

// str1 odkazuje na objekt v poole, str3 na nový objekt na halde.
System.out.println(str1 == str3); // false

// Kontrola hodnoty:
// Všetky reťazce majú rovnakú hodnotu.
System.out.println(str1.equals(str3)); // true

Rozdiely v tabuľke:

Kritérium Literál reťazca ("abc") new String("abc")
Miesto vytvorenia String Pool Heap (halda)
Vytvorenie objektu Vráti existujúci alebo vytvorí nový Vždy vytvorí nový objekt
Optimalizácia pamäte Efektívne využíva pool pre opakovania Môže vytvárať duplikáty, menej efektívne
Porovnanie odkazov (==) Často true pre reťazce s rovnakou hodnotou Vždy false pre reťazce s rovnakou hodnotou, vytvorené samostatne