Kaip eilutės saugomos atmintyje Java kalboje?
sobes.tech AI
Atsakymas iš AI
Java kalboje eilutė (String) yra nepakeičiamas objektas. Jos reikšmė pateikiama simbolių sekos pavidalu.
Iki Java 9, String saugojo simbolius char[] masyve. Kiekvienas simbolis užimdavo 2 baitus (UTF-16).
// Iki Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // Eilutės simboliai
private final int offset; // Pradinis poslinkis
private final int count; // Simbolių skaičius (ilgis)
// ... kiti laukai ir metodai
}
Nuo Java 9, siekiant taupyti atmintį, String gali naudoti arba byte[] masyvą (ASCII/Latin-1 simboliams), arba char[] masyvą (UTF-16 simboliams). Kodavimo nustatymui naudojamas coder žymeklis.
// Nuo Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // Simboliai (`byte[]` arba `char[]` pagal `coder`)
private final byte coder; // Kodavimas: 0 Latin-1, 1 UTF-16
// ... kiti laukai ir metodai
}
Eilutės literatai (ir eilutės, sukurtos naudojant new String(...)) saugomi "kauptoje" (heap) atmintyje.
Eilutės literatai taip pat patenka į "eilutinių baseiną" (String Pool), kuris yra PermGen (iki Java 8) arba MetaSpace (nuo Java 8) atminties srityje. Jei tokia reikšmė jau yra baseine, naudojamas esamas objektas.
String s1 = "hello"; // Sukuria "hello" String Pool'e (jei dar nėra), s1 nurodo į jį
String s2 = "hello"; // s2 nurodo į tą patį "hello" objektą String Pool'e
String s3 = new String("hello"); // Sukuria naują "hello" objektą heap'e, s3 nurodo į jį. "hello" gali būti ir String Pool'e
Kadangi eilutės yra nepakeičiamos, jų reikšmės keitimas (pavyzdžiui, sujungimas) sukuria naują String objektą atmintyje.