Sobes.tech
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 String objektumot a poolban, és visszaadja a hivatkozását.

Stringek létrehozása és a pool:

  1. Literal használatával:
    // "szia" egy string literal
    String s1 = "szia";
    String s2 = "szia";
    // s1 és s2 ugyanarra az objektumra hivatkozik a poolban
    
  2. 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.
    
  3. 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 az equals() 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