Sobes.tech
Middle

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.