Sobes.tech
Middle

Jak jsou řetězce uloženy v paměti v jazyce Java?

sobes.tech AI

Odpověď od AI

V Javě je řetězec (String) nemměnitelný objekt. Jeho hodnota je reprezentována posloupností znaků.

Až do Java 9, String ukládal znaky v poli char[]. Každý znak zabíral 2 bajty (UTF-16).

// Do Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // Znaky řetězce
    private final int offset;   // Počáteční posun
    private final int count;    // Počet znaků (délka)
    // ... další pole a metody
}

Od Java 9 může String šetřit paměť použitím buď pole byte[] (pro ASCII/Latin-1 znaky), nebo pole char[]. Kódování je určeno příznakem coder.

// Od Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // Znaky řetězce (byte[] nebo char[] v podstatě, podle coderu)
    private final byte coder;   // Kódování: 0 pro Latin-1, 1 pro UTF-16
    // ... další pole a metody
}

Literály řetězců (povolené znaky) a řetězce vytvořené pomocí operátoru new String(...) jsou uloženy na "heap".

Literály řetězců jsou také umístěny v "String Pool" (bazén řetězců), který se nachází v oblasti paměti PermGen (před Java 8) nebo MetaSpace (od Java 8). Pokud již v bazénu existuje řetězec se stejnou hodnotou, je použita reference na existující objekt.

String s1 = "hello"; // Vytvoří "hello" v String Pool (pokud ještě neexistuje), s1 na něj odkazuje
String s2 = "hello"; // s2 odkazuje na stejný objekt "hello" v String Pool
String s3 = new String("hello"); // Vytvoří nový objekt "hello" na heap, s3 na něj odkazuje. "hello" může být v String Pool

Protože jsou řetězce immutable, jakákoli změna hodnoty řetězce (například spojení) vede k vytvoření nového objektu String v paměti.