Como é que as strings são armazenadas na memória em Java?
sobes.tech IA
Resposta da IA
Em Java, uma string (String) é um objeto imutável. O seu valor é representado por uma sequência de caracteres.
Até Java 9, o String armazenava os caracteres num array char[]. Cada caractere ocupava 2 bytes (UTF-16).
// Até Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final char value[]; // Caracteres da string
private final int offset; // Deslocamento inicial
private final int count; // Número de caracteres (comprimento)
// ... outros campos e métodos
}
Com Java 9, para poupar memória, o String pode usar um array byte[] ou um array char[]. A codificação é determinada pela flag coder.
// Desde Java 9
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value; // Caracteres da string (byte[] ou char[] na prática, dependendo do coder)
private final byte coder; // Codificação: 0 para Latin-1, 1 para UTF-16
// ... outros campos e métodos
}
Os literais de string (caracteres permitidos) e as strings criadas com o operador new String(...) são armazenados no "heap".
Os literais de string também são colocados no "Pool de Strings" (String Pool), localizado na área de memória PermGen (antes do Java 8) ou MetaSpace (a partir do Java 8). Se uma string com esse valor já existir no pool, uma referência ao objeto existente é usada.
String s1 = "hello"; // Cria "hello" no String Pool (se ainda não existir), s1 referencia-o
String s2 = "hello"; // s2 referencia ao mesmo objeto "hello" no String Pool
String s3 = new String("hello"); // Cria um novo objeto "hello" no heap, s3 referencia-o. "hello" pode estar no String Pool
Como as strings são imutáveis, modificar o valor de uma string (por exemplo, concatenação) leva à criação de um novo objeto String na memória.