Kako se nizovi čuvaju u memoriji u Javi?
sobes.tech АИ
Одговор од АИ
U Javi, String je nepromenljiv objekat. Njegova vrednost je predstavljena nizom karaktera.
Do Java 9, String je čuvao karaktere u nizu char[]. Svaki karakter je zauzimao 2 bajta (UTF-16).
// Do Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // Karakteri niza
private final int offset; // Početni pomak
private final int count; // Broj karaktera (dužina)
// ... drugi atributi i metode
}
Od Java 9, za uštedu memorije, String može koristiti ili niz byte[] (za ASCII/Latin-1 karaktere), ili niz char[]. Kodiranje se određuje pomoću zastavice coder.
// Od Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // Karakteri niza (byte[] ili char[] u suštini, u zavisnosti od coder)
private final byte coder; // Kodiranje: 0 za Latin-1, 1 za UTF-16
// ... drugi atributi i metode
}
String literali (dozvoljeni karakteri) i stringovi kreirani pomoću operatora new String(...) se čuvaju u "heap".
String literali se takođe smeštaju u "String Pool" (bazen stringova), koji se nalazi u oblasti memorije PermGen (pre Java 8) ili MetaSpace (od Java 8 nadalje). Ako već postoji string sa istom vrednošću u bazenu, koristi se referenca na postojeći objekat.
String s1 = "hello"; // Kreira "hello" u String Pool-u (ako već ne postoji), s1 se na njega referencira
String s2 = "hello"; // s2 se referencira na isti objekat "hello" u String Pool-u
String s3 = new String("hello"); // Kreira novi objekat "hello" na heap-u, s3 se na njega referencira. "hello" može biti u String Pool-u
Pošto su stringovi nepromenljivi, promena vrednosti stringa (npr. konkatenacija) dovodi do kreiranja novog String objekta u memoriji.