Obiectele de tip
String pot fi create in Java folosind 2 metode:
- prin atribuire directa:
String aString1 = "sometext";
- cu ajutorul operatorului new:
String aString2 = new String("sometext");
In primul caz obiectul este alocat in
String Pool, acesta fiind parte componenta a memoriei heap. De fiecare data cand un string este creat prin atribuire JVM cauta intai sa vada daca acea valoare nu este deja in String Pool, daca da noua variabila va referi acea valoare din String Pool, daca nu, va fi creata una noua.
In al doilea caz, de fiecare data in memoria JVM va fi creata un nou obiect de tip String, deci, de fiecare data va fi referita alta zona de memorie.
La comparare, ceea ce e in String Pool comparat cu ce e in String Pool va da intotdeauna true, fie daca se foloseste equals() sau ==.
Ex.:
String a = "text";
String b = "text";
System.out.println(a == b); // se compara referinta
System.out.println(a.equals(b)); // se compara valoarea(la String-uri)
true
true
La comparare intre doua obiecte din memoria JVM avem false, pentru ==, deoarece se compara referinta, iar pentru equals() rezultatul este true, deoarece pentru string-uri se compara valoarea.
Ex.:
String a = new String("text");
String b = new String("text");
System.out.println(a == b); // se compara doua referinte diferite
System.out.println(a.equals(b)); // se compara aceeasi valoare
...
false
true
La comparare intre obiecte string din JVM si din String Pool avem
Ex.:
String a = new String("text");
String b = "text";
System.out.println(a == b); // se compara o referinta la memoria JVM si o referinta la String Pool
System.out.println(a.equals(b)); // se compara aceeasi valoare
...
false
true
Pentru Object equals() compara referinta. Operatorul == foloseste comportamentul implicit(specific Object) al metodei equals(). Pentru string-uri insa aceasta metoda este suprascrisa, implicit fiind comparata valoarea.