Sobes.tech
Junior

Ce este un pool de stringuri în Java?

sobes.tech AI

Răspuns de la AI

Pool-ul de șiruri (String pool) este o zonă specială de memorie în heap-ul Java, unde sunt stocate literalii de șiruri și șirurile internate. Scopul său principal este economisirea memoriei prin reutilizarea valorilor de șiruri identice.

Cum funcționează:

Când se creează un literal de șir (de exemplu, "salut"), JVM verifică mai întâi dacă există deja un șir cu aceeași valoare în pool-ul de șiruri.

  • Dacă șirul există: JVM returnează o referință la obiectul deja existent în pool, în loc să creeze unul nou.
  • Dacă șirul nu există: JVM creează un nou obiect String în pool și returnează o referință către acesta.

Crearea de șiruri și pool:

  1. Folosing un literal de șir:
    // "salut" este un literal de șir
    String s1 = "salut";
    String s2 = "salut";
    // s1 și s2 vor face referire la același obiect în pool-ul de șiruri
    
  2. Folosing constructorul new String():
    String s3 = new String("lume");
    String s4 = new String("lume");
    // s3 și s4 vor face referire la obiecte diferite în heap, chiar dacă au aceeași valoare.
    // Literalul de șir "lume" poate fi în pool, dar obiectele s3 și s4 sunt în afara lui.
    
  3. Metoda intern():
    String s5 = new String("java");
    // Metoda intern() verifică dacă există deja un șir cu această valoare în pool
    String s6 = s5.intern();
    // Dacă da, returnează referința la obiectul din pool.
    // Dacă nu, adaugă șirul curent în pool și returnează referința.
    

Avantajele pool-ului de șiruri:

  • Economisirea memoriei: Reduce numărul de obiecte de șir duplicate.
  • Îmbunătățirea performanței: Compararea literalelor de șir (==) poate fi mai rapidă decât compararea obiectelor String cu equals(), dacă ambele referințe indică același obiect în pool.

Notă importantă:

Compararea șirurilor cu operatorul == verifică dacă cele două variabile fac referire la același obiect în memorie. Pentru compararea conținutului șirurilor, folosiți întotdeauna metoda equals().

String str1 = "abc"; // În pool
String str2 = "abc"; // În pool, aceeași referință
String str3 = new String("abc"); // În afara pool-ului
String str4 = str3.intern(); // În pool, aceeași referință ca str1 și 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