Sobes.tech
Middle

Comment les chaînes sont-elles stockées en mémoire en Java?

sobes.tech IA

Réponse de l'IA

En Java, une chaîne (String) est un objet immuable. Sa valeur est représentée par une séquence de caractères.

Jusqu'à Java 9, String stockait les caractères dans un tableau char[]. Chaque caractère occupait 2 octets (UTF-16).

// Jusqu'à Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // Caractères de la chaîne
    private final int offset;   // Décalage initial
    private final int count;    // Nombre de caractères (longueur)
    // ... autres champs et méthodes
}

Avec Java 9, pour économiser de la mémoire, String peut utiliser soit un tableau byte[] (pour les caractères ASCII/Latin-1), soit un tableau char[] (pour les caractères UTF-16). La codification est déterminée par le drapeau coder.

// Depuis Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // Caractères de la chaîne (byte[] ou char[] en réalité, selon le coder)
    private final byte coder;   // Codage : 0 pour Latin-1, 1 pour UTF-16
    // ... autres champs et méthodes
}

Les littéraux de chaînes (caractères autorisés) et les chaînes créées avec l'opérateur new String(...) sont stockés dans le "tas" (heap).

Les littéraux de chaînes sont également placés dans le "pool de chaînes" (String Pool), situé dans la zone de mémoire PermGen (avant Java 8) ou MetaSpace (à partir de Java 8). Si une chaîne avec cette valeur existe déjà dans le pool, une référence à l'objet existant est utilisée.

String s1 = "hello"; // Crée "hello" dans le String Pool (si pas déjà présent), s1 y fait référence
String s2 = "hello"; // s2 fait référence au même objet "hello" dans le String Pool
String s3 = new String("hello"); // Crée un nouvel objet "hello" dans le tas, s3 y fait référence. "hello" peut être dans le String Pool

Puisque les chaînes sont immuables, modifier la valeur d'une chaîne (par exemple, concaténation) conduit à la création d'un nouvel objet String en mémoire.