Come vengono memorizzate le stringhe in memoria in Java?
sobes.tech AI
Risposta dell'AI
In Java, una stringa (String) è un oggetto immutabile. Il suo valore è rappresentato da una sequenza di caratteri.
Fino a Java 9, String memorizzava i caratteri in un array char[]. Ogni carattere occupava 2 byte (UTF-16).
// Fino a Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // Caratteri della stringa
private final int offset; // Offset iniziale
private final int count; // Numero di caratteri (lunghezza)
// ... altri campi e metodi
}
Con Java 9, per risparmiare memoria, String può usare un array byte[] o un array char[]. La codifica viene determinata dal flag coder.
// Da Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // Caratteri della stringa (byte[] o char[] in realtà, a seconda del coder)
private final byte coder; // Codifica: 0 per Latin-1, 1 per UTF-16
// ... altri campi e metodi
}
I letterali di stringa (caratteri consentiti) e le stringhe create con l'operatore new String(...) sono memorizzati nello "heap".
I letterali di stringa sono anche collocati nel "Pool di Stringhe" (String Pool), che si trova nell'area di memoria PermGen (prima di Java 8) o MetaSpace (da Java 8 in poi). Se una stringa con lo stesso valore esiste già nel pool, viene usato un riferimento all'oggetto esistente.
String s1 = "hello"; // Crea "hello" nel String Pool (se non esiste già), s1 fa riferimento ad esso
String s2 = "hello"; // s2 fa riferimento allo stesso oggetto "hello" nel String Pool
String s3 = new String("hello"); // Crea un nuovo oggetto "hello" nello heap, s3 fa riferimento ad esso. "hello" può essere nel String Pool
Poiché le stringhe sono immutabili, modificare il valore di una stringa (ad esempio, concatenazione) porta alla creazione di un nuovo oggetto String in memoria.