String.intern în Java

Returnează exemplarul unic, din rezerva internă a JVM, pentru textul dat; textele egale devin același obiect.

Sintaxă
String intern()

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ște equals.

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.