¿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.