Sobes.tech
Middle

Cum sunt stocate șirurile în memorie în Java?

sobes.tech AI

Răspuns de la AI

În Java, un șir de caractere (String) este un obiect imutabil. Valoarea sa este reprezentată printr-o secvență de caractere.

Până la Java 9, String stoca caracterele într-un array char[]. Fiecare caracter ocupa 2 bytes (UTF-16).

// Până la Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // Caracterele șirului
    private final int offset;   // Offset inițial
    private final int count;    // Numărul de caractere (lungime)
    // ... alte câmpuri și metode
}

De la Java 9, pentru economisirea memoriei, String poate folosi fie un array byte[] (pentru caractere ASCII/Latin-1), fie un array char[]. Codificarea este determinată de flag-ul coder.

// Începând cu Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // Caracterele șirului (byte[] sau char[] în esență, în funcție de coder)
    private final byte coder;   // Codificare: 0 pentru Latin-1, 1 pentru UTF-16
    // ... alte câmpuri și metode
}

Literalele de șiruri (caractere permise) și șirurile create cu operatorul new String(...) sunt stocate pe "heap".

Literalele de șiruri sunt, de asemenea, plasate în "Pool-ul de șiruri" (String Pool), care se află în zona de memorie PermGen (până la Java 8) sau MetaSpace (de la Java 8 încolo). Dacă un șir cu aceeași valoare există deja în pool, se folosește o referință la obiectul existent.

String s1 = "hello"; // Creează "hello" în String Pool (dacă nu există deja), s1 face referire la el
String s2 = "hello"; // s2 face referire la același obiect "hello" în String Pool
String s3 = new String("hello"); // Creează un nou obiect "hello" pe heap, s3 face referire la el. "hello" poate fi în String Pool

Deoarece șirurile sunt imutabile, modificarea valorii unui șir (de exemplu, concatenarea) duce la crearea unui nou obiect String în memorie.