Junior
Mi az a sztring pool Java-ban?
sobes.tech MI
Válasz az MI-től
A String pool egy speciális memória terület a Java heap-ben, ahol a string literálok és az internált stringek tárolódnak. Fő célja a memória megtakarítása azonos string értékek újrahasználásával.
Hogyan működik:
Amikor egy string literált hozunk létre (pl. "szia"), a JVM először ellenőrzi, hogy már létezik-e ilyen értékű string a poolban.
- Ha létezik: A JVM visszaadja a már létező objektum hivatkozását a poolból, új létrehozása helyett.
- Ha nem létezik: A JVM létrehoz egy új
Stringobjektumot a poolban, és visszaadja a hivatkozását.
Stringek létrehozása és a pool:
- Literal használatával:
// "szia" egy string literal String s1 = "szia"; String s2 = "szia"; // s1 és s2 ugyanarra az objektumra hivatkozik a poolban - A
new String()konstruktorral:String s3 = new String("világ"); String s4 = new String("világ"); // s3 és s4 külön objektumokra hivatkozik, még akkor is, ha ugyanaz a értékük. // A "világ" literal a poolban lehet, de az s3 és s4 objektumok kívül vannak. - Az
intern()metódussal:String s5 = new String("java"); // Az intern() ellenőrzi, hogy van-e már ilyen értékű string a poolban String s6 = s5.intern(); // Ha igen, visszaadja a poolban lévő objektum hivatkozását. // Ha nem, hozzáadja az aktuális stringet a poolhoz, és visszaadja a hivatkozását.
A string pool előnyei:
- Memória megtakarítás: Csökkenti a duplikált string objektumok számát.
- Teljesítmény növelése: A literal stringek összehasonlítása (
==) gyorsabb lehet, mint azequals()használata, ha mindkét referencia ugyanarra az objektumra mutat a poolban.
Fontos megjegyzés:
A stringek összehasonlítása a == operátorral azt ellenőrzi, hogy két változó ugyanarra az objektumra mutat-e a memóriában. A stringek tartalmának összehasonlításához mindig az equals() metódust használja.
String str1 = "abc"; // A poolban
String str2 = "abc"; // A poolban, ugyanaz a referencia
String str3 = new String("abc"); // A poolon kívül
String str4 = str3.intern(); // A poolban, ugyanaz a referencia, mint str1 és 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