Ako sa reťazce ukladajú v pamäti v Jave?
sobes.tech AI
Odpoveď od AI
V Jave je reťazec (String) nemenný objekt. Jeho hodnota je reprezentovaná sekvenciou znakov.
Až do Java 9, String ukladala znaky v poli char[]. Každý znak zaberal 2 bajty (UTF-16).
// Až do Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // Znaky reťazca
private final int offset; // Počiatočný posun
private final int count; // Počet znakov (dĺžka)
// ... ďalšie polia a metódy
}
Od Java 9 môže String šetriť pamäť použitím buď poľa byte[] (pre ASCII/Latin-1 znaky), alebo poľa char[]. Kódovanie je určené flagom coder.
// Od Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // Znaky reťazca (byte[] alebo char[] v podstate, podľa coder)
private final byte coder; // Kódovanie: 0 pre Latin-1, 1 pre UTF-16
// ... ďalšie polia a metódy
}
Literály reťazcov (povolené znaky) a reťazce vytvorené pomocou operátora new String(...) sú uložené v "heap".
Literály reťazcov sú tiež umiestnené v "String Pool" (bazén reťazcov), ktorý sa nachádza v oblasti pamäte PermGen (pred Java 8) alebo MetaSpace (od Java 8). Ak už v bazéne existuje reťazec s rovnakou hodnotou, používa sa referencia na existujúci objekt.
String s1 = "hello"; // Vytvorí "hello" v String Pool (ak ešte neexistuje), s1 naň odkazuje
String s2 = "hello"; // s2 odkazuje na ten istý objekt "hello" v String Pool
String s3 = new String("hello"); // Vytvorí nový objekt "hello" na heap, s3 naň odkazuje. "hello" môže byť v String Pool
Keďže reťazce sú immutable, akákoľvek zmena hodnoty reťazca (napríklad spojenie) vedie k vytvoreniu nového objektu String v pamäti.