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:
- 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 - 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. - 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 obiectelorStringcuequals(), 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