Junior
Jaký je rozdíl mezi vytvořením řetězce pomocí dvojitých uvozovek a voláním konstruktoru new String?
sobes.tech AI
Odpověď od AI
Při vytváření řetězce pomocí dvojitých uvozovek ("řetězec") JVM hledá v Poolu řetězců (String Pool) řetězec se stejným obsahem. Pokud takový najde, vrátí odkaz na existující objekt. Pokud ne, vytvoří nový řetězec v Poolu a vrátí odkaz na něj. To optimalizuje využití paměti, protože stejné literály řetězců odkazují na stejný objekt.
Při vytváření řetězce pomocí konstruktoru new String("řetězec") je vždy vytvořen nový řetězec mimo Pool řetězců, i když již v Poolu existuje řetězec se stejným obsahem.
Rozdíly:
- Pool řetězců: Dvojité uvozovky používají Pool řetězců,
new Stringne. - Výkon: Použití dvojitých uvozovek je obvykle rychlejší, protože umožňuje znovupoužití existujících objektů.
- Počet objektů: Dvojité uvozovky mohou vést k menšímu počtu řetězcových objektů v paměti ve srovnání s opakovaným použitím
new Stringse stejným obsahem. - Porovnání:
- Při porovnání řetězců vytvořených dvojitými uvozovkami se stejným obsahem operátor
==vrátítrue, protože odkazují na stejný objekt. - Při porovnání řetězců vytvořených pomocí
new String(i se stejným obsahem) nebo řetězců vytvořených dvojitými uvozovkami s řetězcem vytvořenýmnew String, operátor==vrátífalse, protože se jedná o různé objekty. Pro porovnání obsahu řetězců je vždy třeba používat metoduequals().
- Při porovnání řetězců vytvořených dvojitými uvozovkami se stejným obsahem operátor
Příklad:
// Vytvořeno v Poolu řetězců (nebo znovupoužito)
String s1 = "abc";
// Vytvořeno v Poolu řetězců (používá objekt "abc" z Poolu)
String s2 = "abc";
// Vytvoří nový objekt mimo Pool řetězců
String s3 = new String("abc");
// Vytvoří nový objekt mimo Pool řetězců
String s4 = new String("abc");
// s1 == s2 -> true (odkazují na stejný objekt v Poolu)
// s1 == s3 -> false (různé objekty)
// s3 == s4 -> false (různé objekty)
// s1.equals(s2) -> true (obsah je stejný)
// s1.equals(s3) -> true (obsah je stejný)
// s3.equals(s4) -> true (obsah je stejný)