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 |