Sobes.tech
Middle

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.