Sobes.tech
Middle

Hoe worden strings opgeslagen in het geheugen in Java?

sobes.tech AI

Antwoord van AI

In Java is een string (String) een onveranderlijk object. De waarde wordt weergegeven door een reeks tekens.

Tot Java 9 slaatte String de tekens in een array char[]. Elk teken nam 2 bytes in beslag (UTF-16).

// Tot Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // Tekens van de string
    private final int offset;   // Begin-offset
    private final int count;    // Aantal tekens (lengte)
    // ... andere velden en methoden
}

Vanaf Java 9 kan String geheugen besparen door ofwel een byte[] array (voor ASCII/Latin-1 tekens), of een char[] array te gebruiken. De codering wordt bepaald door de flag coder.

// Vanaf Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // Tekens van de string (byte[] of char[] in feite, afhankelijk van coder)
    private final byte coder;   // Codering: 0 voor Latin-1, 1 voor UTF-16
    // ... andere velden en methoden
}

String literals (toegestane tekens) en strings gemaakt met de operator new String(...) worden opgeslagen op de "heap".

String literals worden ook geplaatst in de "String Pool", die zich bevindt in het PermGen-gebied (voor Java 8) of in MetaSpace (vanaf Java 8). Als een string met dezelfde waarde al bestaat in de pool, wordt een verwijzing naar dat object gebruikt.

String s1 = "hello"; // Maakt "hello" in de String Pool (als het nog niet bestaat), s1 verwijst ernaar
String s2 = "hello"; // s2 verwijst naar hetzelfde "hello" object in de String Pool
String s3 = new String("hello"); // Maakt een nieuw "hello" object op de heap, s3 verwijst ernaar. "hello" kan in de String Pool zitten

Omdat strings onveranderlijk zijn, leidt het wijzigen van de waarde van een string (bijvoorbeeld concatenatie) tot het maken van een nieuw String object in het geheugen.