Ce face String.intern
JVM-ul păstrează o rezervă (string pool) cu literalele din cod: toate aparițiile lui "Iași" din program sunt același obiect. Șirurile create la rulare (citite, concatenate, cu new String) sunt obiecte separate.
s.intern() caută în rezervă un șir egal cu s. Dacă există, îl returnează pe acela; dacă nu, îl adaugă pe s și îl returnează. Astfel, pentru oricare două șiruri, a.intern() == b.intern() este adevărat exact când a.equals(b).
În programele obișnuite nu ai nevoie de intern(). Metoda poate economisi memorie când ai milioane de copii ale acelorași texte, dar pentru comparații folosește în continuare equals.
Ce returnează
Șirul unic din rezervă, egal ca text cu cel curent.
Exemple
Exemplul 1: Literale, obiecte noi și intern()
public class Main {
public static void main(String[] args) {
String a = "Iași";
String b = "Iași";
String c = new String("Iași");
String d = c.intern();
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);
System.out.println(a.equals(c));
}
}
Rezultat
true
false
true
true
Exemplul 2: Șiruri construite la rulare
public class Main {
public static void main(String[] args) {
String parte = "Cluj";
String construit = parte + "-Napoca";
String literal = "Cluj-Napoca";
System.out.println(construit == literal);
System.out.println(construit.intern() == literal);
}
}
Rezultat
false
true
Greșeli frecvente
- Folosești
intern()ca să poți compara apoi cu==. Este fragil: un singur șir neinternat strică totul. Foloseșteequals.
Comenzi înrudite
String.equals: Verifică dacă două șiruri au exact același text; equalsIgnoreCase și equalsFoldCase ignoră literele mari/mici.String: Clasa pentru text în Java: un șir de caractere care nu se mai poate modifica după ce a fost creat.String.hashCode: Returnează codul hash al textului, calculat după o formulă fixă; șirurile egale au mereu același cod.