Sobes.tech
Junior

Aký je rozdiel medzi vytvorením reťazca pomocou dvojitých úvodzoviek a volaním konštruktora new String?

sobes.tech AI

Odpoveď od AI

Keď vytvárate reťazec pomocou dvojitých úvodzoviek ("reťazec"), JVM hľadá v Pooli reťazcov (String Pool) reťazec s rovnakým obsahom. Ak taký nájde, vráti odkaz na existujúci objekt. Ak nie, vytvorí nový objekt reťazca v Pooli a vráti odkaz naň. Týmto sa optimalizuje využitie pamäte, pretože rovnaké literály reťazcov odkazujú na ten istý objekt.

Pri vytváraní reťazca pomocou konštruktora new String("reťazec") sa vždy vytvorí nový objekt mimo Poolu reťazcov, aj keď v Pooli už existuje reťazec s rovnakým obsahom.

Rozdiely:

  • Pool reťazcov: Dvojité úvodzovky používajú Pool reťazcov, new String nie.
  • Výkon: Použitie dvojitých úvodzoviek je zvyčajne rýchlejšie, pretože umožňuje opätovné použitie existujúcich objektov.
  • Počet objektov: Dvojité úvodzovky môžu viesť k menšiemu počtu objektov reťazcov v pamäti v porovnaní s opakovaným použitím new String s rovnakým obsahom.
  • Porovnanie:
    • Pri porovnávaní reťazcov vytvorených dvojitými úvodzovkami s rovnakým obsahom operátor == vráti true, pretože odkazujú na ten istý objekt.
    • Pri porovnávaní reťazcov vytvorených pomocou new String (aj s rovnakým obsahom) alebo reťazcov vytvorených dvojitými úvodzovkami s reťazcom vytvoreným pomocou new String, operátor == vráti false, pretože ide o rôzne objekty. Na porovnanie obsahu reťazcov je vždy potrebné použiť metódu equals().

Príklad:

// Vytvorené v Pooli reťazcov (alebo opätovne použité)
String s1 = "abc";

// Vytvorené v Pooli reťazcov (recykluje objekt "abc" z Poolu)
String s2 = "abc";

// Vytvorí nový objekt mimo Pool reťazcov
String s3 = new String("abc");

// Vytvorí nový objekt mimo Pool reťazcov
String s4 = new String("abc");

// s1 == s2 -> true (odkazujú na ten istý objekt v Pooli)
// s1 == s3 -> false (rôzne objekty)
// s3 == s4 -> false (rôzne objekty)

// s1.equals(s2) -> true (obsah je rovnaký)
// s1.equals(s3) -> true (obsah je rovnaký)
// s3.equals(s4) -> true (obsah je rovnaký)