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.