Sobes.tech
Middle

¿Cómo se almacenan las cadenas en la memoria en Java?

sobes.tech AI

Respuesta de la IA

En Java, la cadena (String) es un objeto inmutable. Su valor se representa mediante una secuencia de caracteres.

Hasta Java 9, String almacenaba los caracteres en un array char[]. Cada carácter ocupaba 2 bytes (UTF-16).

// Hasta Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final char value[]; // Caracteres de la cadena
    private final int offset;   // Desplazamiento inicial
    private final int count;    // Número de caracteres (longitud)
    // ... otros campos y métodos
}

Con Java 9, para ahorrar memoria, String puede usar ya sea un array byte[] (para caracteres ASCII/Latin-1), o un array char[] (para caracteres UTF-16). Para determinar la codificación, se usa la bandera coder.

// Desde Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
    private final byte[] value; // Caracteres de la cadena (byte[] o char[] en realidad, dependiendo de coder)
    private final byte coder;   // Codificación: 0 para Latin-1, 1 para UTF-16
    // ... otros campos y métodos
}

Los literales de cadenas (símbolos permitidos) y las cadenas creadas mediante el operador new String(...) se almacenan en el "montón" (heap).

Los literales de cadenas también se colocan en el "pool de cadenas" (String Pool), que se encuentra en el área de memoria PermGen (antes de Java 8) o MetaSpace (desde Java 8). Si una cadena con ese valor ya existe en el pool, se usa una referencia al objeto existente.

String s1 = "hello"; // Crea "hello" en el String Pool (si no existe), s1 hace referencia a él
String s2 = "hello"; // s2 hace referencia al mismo objeto "hello" en el String Pool
String s3 = new String("hello"); // Crea un nuevo objeto "hello" en el heap, s3 hace referencia a él. "hello" puede estar en el String Pool

Dado que las cadenas son inmutables, modificar el valor de una cadena (por ejemplo, concatenación) conduce a la creación de un nuevo objeto String en la memoria.