Sobes.tech
Middle

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.