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
Stringno pool de strings e retorna uma referência a ele.
Criação de strings e pool:
- 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 - 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. - 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 objetosStringcomequals(), 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