Sobes.tech
Junior

O que é um pool de strings em Java?

sobes.tech IA

Resposta da IA

O pool de strings é uma área especial de memória no heap do Java, onde são armazenados literais de strings e strings internadas. O seu objetivo principal é economizar memória através da reutilização de valores de strings iguais.

Como funciona:

Quando um literal de string é criado (por exemplo, "olá"), a JVM verifica primeiro se já existe uma string com esse valor no pool de strings.

  • Se a string existir: A JVM retorna uma referência ao objeto já existente no pool, em vez de criar um novo.
  • Se a string não existir: A JVM cria um novo objeto String no pool de strings e retorna uma referência a ele.

Criação de strings e pool:

  1. Usando um literal de string:
    // "olá" é um literal de string
    String s1 = "olá";
    String s2 = "olá";
    // s1 e s2 irão referenciar o mesmo objeto no pool de strings
    
  2. Usando o construtor new String():
    String s3 = new String("mundo");
    String s4 = new String("mundo");
    // s3 e s4 irão referenciar objetos diferentes no heap, mesmo que tenham o mesmo valor.
    // O literal de string "mundo" pode estar no pool, mas os objetos s3 e s4 estão fora dele.
    
  3. Método intern():
    String s5 = new String("java");
    // O método intern() verifica se há uma string com esse valor no pool
    String s6 = s5.intern();
    // Se existir, retorna a referência ao objeto no pool.
    // Se não, adiciona a string atual ao pool e retorna a referência.
    

Vantagens do pool de strings:

  • Economia de memória: Reduz o número de objetos de string duplicados.
  • Melhoria de desempenho: Comparar strings literais (==) pode ser mais rápido do que comparar objetos String com equals(), se ambos os operandos fizerem referência ao mesmo objeto no pool.

Nota importante:

A comparação de strings com o operador == verifica se duas variáveis referenciam o mesmo objeto na memória. Para comparar o conteúdo das strings, sempre use o método equals().

String str1 = "abc"; // No pool
String str2 = "abc"; // No pool, mesma referência
String str3 = new String("abc"); // Fora do pool
String str4 = str3.intern(); // No pool, mesma referência que str1 e str2

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str3)); // true