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 Stringnie. - 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 Strings rovnakým obsahom. - Porovnanie:
- Pri porovnávaní reťazcov vytvorených dvojitými úvodzovkami s rovnakým obsahom operátor
==vrátitrue, 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 pomocounew String, operátor==vrátifalse, pretože ide o rôzne objekty. Na porovnanie obsahu reťazcov je vždy potrebné použiť metóduequals().
- Pri porovnávaní reťazcov vytvorených dvojitými úvodzovkami s rovnakým obsahom operátor
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ý)