Wie werden Strings im Speicher in Java gespeichert?
sobes.tech KI
Antwort von AI
In Java ist eine Zeichenkette (String) ein unveränderliches Objekt. Sein Wert wird durch eine Sequenz von Zeichen dargestellt.
Bis Java 9 speicherte String die Zeichen in einem Array char[]. Jedes Zeichen belegte 2 Bytes (UTF-16).
// Bis Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // Zeichenkette
private final int offset; // Anfangsversatz
private final int count; // Anzahl der Zeichen (Länge)
// ... andere Felder und Methoden
}
Mit Java 9 kann String zum Speichern von Speicherplatz entweder ein byte[]-Array (für ASCII/Latin-1-Zeichen) oder ein char[]-Array (für UTF-16-Zeichen) verwenden. Die Kodierung wird durch das Flag coder bestimmt.
// Ab Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // Zeichenkette (byte[] oder char[] im Wesentlichen, abhängig vom coder)
private final byte coder; // Kodierung: 0 für Latin-1, 1 für UTF-16
// ... andere Felder und Methoden
}
Zeichenkettenliterale (zulässige Zeichen) und mit new String(...) erstellte Strings werden im "Heap" gespeichert.
Zeichenkettenliterale werden auch im "String-Pool" abgelegt, der sich im PermGen-Bereich (vor Java 8) oder im MetaSpace (ab Java 8) befindet. Wenn eine Zeichenkette mit diesem Wert bereits im Pool existiert, wird eine Referenz auf das bestehende Objekt verwendet.
String s1 = "hello"; // Erstellt "hello" im String-Pool (falls noch nicht vorhanden), s1 verweist darauf
String s2 = "hello"; // s2 verweist auf dasselbe "hello"-Objekt im String-Pool
String s3 = new String("hello"); // Erstellt ein neues "hello"-Objekt im Heap, s3 verweist darauf. "hello" kann im String-Pool sein
Da Strings unveränderlich sind, führt eine Änderung des String-Werts (z.B. Verkettung) dazu, dass ein neues String-Objekt im Speicher erstellt wird.