Sobes.tech
Junior

Čo je to pool reťazcov v Jave?

sobes.tech AI

Odpoveď od AI

Pool reťazcov (String pool) je špeciálna oblasť pamäte v halde (heap) Javy, kde sa ukladajú literály reťazcov a internované reťazce. Jeho hlavným cieľom je úspora pamäte prostredníctvom opakovaného používania rovnakých hodnot reťazcov.

Ako to funguje:

Keď sa vytvorí literál reťazca (napríklad "hello"), JVM najskôr skontroluje, či už v poole reťazcov neexistuje rovnaká hodnota.

  • Ak reťazec existuje: JVM vráti odkaz na už existujúci objekt v poole, namiesto vytvorenia nového.
  • Ak reťazec neexistuje: JVM vytvorí nový objekt String v poole reťazcov a vráti odkaz naň.

Vytváranie reťazcov a pool:

  1. Pomocou literálu reťazca:
    // "hello" je literál reťazca
    String s1 = "hello";
    String s2 = "hello";
    // s1 a s2 budú odkazovať na ten istý objekt v poole reťazcov
    
  2. Pomocou konštruktora new String():
    String s3 = new String("world");
    String s4 = new String("world");
    // s3 a s4 budú odkazovať na rôzne objekty v halde, aj keď majú rovnakú hodnotu.
    // Literál reťazca "world" môže byť v poole, ale objekty s3 a s4 nie.
    
  3. Metóda intern():
    String s5 = new String("java");
    // Metóda intern() kontroluje, či v poole existuje reťazec s rovnakou hodnotou
    String s6 = s5.intern();
    // Ak áno, vráti odkaz na objekt z poľa.
    // Ak nie, pridá aktuálny reťazec do poľa a vráti odkaz naň.
    

Výhody poolu reťazcov:

  • Úspora pamäte: Znižuje počet duplikovaných objektov reťazcov.
  • Zvýšenie výkonu: Porovnávanie reťazcov literálmi (==) môže byť rýchlejšie ako porovnávanie objektov String pomocou equals(), ak oba operandy odkazujú na ten istý objekt v poole.

Dôležité:

Porovnávanie reťazcov operátorom == kontroluje, či dve premenné odkazujú na ten istý objekt v pamäti. Na porovnanie obsahu reťazcov vždy používajte metódu equals().

String str1 = "abc"; // V poole
String str2 = "abc"; // V poole, rovnaká referencia
String str3 = new String("abc"); // Mimo poľa
String str4 = str3.intern(); // V poole, rovnaká referencia ako u str1 a str2

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str3)); // true