Kā virknes tiek glabātas atmiņā Java valodā?
sobes.tech AI
Atbilde no AI
Java valodā rinda (String) ir nemainīga objekts. Tās vērtība ir simbolu secība.
Līdz Java 9, String glabāja simbolus char[] masīvā. Katrs simbols aizņēma 2 baitus (UTF-16).
// Līdz Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // Rindas simboli
private final int offset; // Sākuma nobīde
private final int count; // Simbolu skaits (garums)
// ... citi lauki un metodes
}
No Java 9, lai taupītu atmiņu, String var izmantot vai nu byte[] masīvu (ASCII/Latin-1 simboliem), vai char[] masīvu (UTF-16 simboliem). Kodēšanas noteikšanai tiek izmantots coder zīmogs.
// No Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // Simboli (`byte[]` vai `char[]` pēc `coder`)
private final byte coder; // Kodēšana: 0 Latin-1, 1 UTF-16
// ... citi lauki un metodes
}
Rindas literāli (un rindas, kas izveidotas ar new String(...)) tiek glabātas "grozā" (heap).
Rindas literāli arī tiek ievietoti "rindu baseinā" (String Pool), kas atrodas PermGen (līdz Java 8) vai MetaSpace (no Java 8) atmiņas zonā. Ja šāda vērtība jau pastāv baseinā, tiek izmantots esošais objekts.
String s1 = "hello"; // Izveido "hello" String Pool, ja tas vēl nepastāv, s1 norāda uz to
String s2 = "hello"; // s2 norāda uz to pašu "hello" objektu String Pool
String s3 = new String("hello"); // Izveido jaunu "hello" objektu heap'ā, s3 norāda uz to. "hello" var būt arī String Pool
Tā kā rindas ir nemainīgas, to vērtības maiņa (piemēram, savienošana) rada jaunu String objektu atmiņā.