Sobes.tech
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 String ne.
  • 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 String se 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ým new 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 metodu equals().

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ý)