Sobes.tech
Middle

Hogyan tárolódnak a sztringek a memóriában Java-ban?

sobes.tech MI

Válasz az MI-től

Java-ban a String egy immutable (változtathatatlan) objektum. Az értéke egy karakterlánc sorozatával van reprezentálva.

Java 9-ig a String a karaktereket egy char[] tömbben tárolta. Minden karakter 2 bájt (UTF-16) helyet foglalt.

// Java 9-ig
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // A karakterlánc karakterei
    private final int offset;   // Kezdő eltolás
    private final int count;    // Karakterek száma (hossz)
    // ... más mezők és metódusok
}

Java 9-től kezdődően, a memória takarékossága érdekében, a String vagy byte[] tömböt (ASCII/Latin-1 karakterekhez), vagy char[] tömböt használhat. A kódolást a coder zászló határozza meg.

// Java 9-től
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // A karakterlánc karakterei (byte[] vagy char[] lényegében, a coder-től függően)
    private final byte coder;   // Kódolás: 0 Latin-1-hez, 1 UTF-16-hoz
    // ... más mezők és metódusok
}

A string literálok (megengedett karakterek) és a new String(...) segítségével létrehozott stringek a "heap"-en tárolódnak.

A string literálok továbbá a "String Pool"-ban helyezkednek el, amely a PermGen memória területen (Java 8 előtt) vagy a MetaSpace-ben (Java 8-tól) található. Ha egy ilyen értékű string már létezik a pool-ban, akkor a meglévő objektumra mutató hivatkozást használják.

String s1 = "hello"; // Létrehozza a "hello"-t a String Pool-ban (ha még nem létezik), s1 erre mutat
String s2 = "hello"; // s2 ugyanarra az objektumra mutat, mint s1
String s3 = new String("hello"); // Új "hello" objektumot hoz létre a heap-en, s3 erre mutat. "hello" lehet a String Pool-ban

Mivel a stringek immutable-ek, a string értékének módosítása (pl. összefűzés) új String objektum létrehozásához vezet a memóriában.