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
Stringv poole reťazcov a vráti odkaz naň.
Vytváranie reťazcov a pool:
- 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 - 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. - 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 objektovStringpomocouequals(), 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