Sobes.tech
Junior

Qual é a diferença entre criar uma string usando new String() e usar um literal de string?

sobes.tech IA

Resposta da IA

Ao usar um literal de string ("abc"), a string é criada no pool de strings (String Pool). Se uma string com o mesmo valor já existir no pool, é retornada uma referência para esse objeto existente. Isto é uma otimização para poupar memória.

Ao usar new String("abc"), um novo objeto de string é sempre criado no heap, mesmo que uma string com o mesmo valor já exista no pool.

Exemplo:

// Um literal de string "hello" é criado. Se não existir no pool, é adicionado.
// str1 referencia o objeto no pool.
String str1 = "hello";

// O literal "hello" é reutilizado. Como já está no pool,
// str2 também referencia o mesmo objeto no pool que str1.
String str2 = "hello";

// Um novo objeto de string com o valor "hello" é criado no heap.
// str3 referencia esse novo objeto no heap, não o do pool.
String str3 = new String("hello");

// Verificação de referências:
// str1 e str2 referenciam o mesmo objeto no pool.
System.out.println(str1 == str2); // true

// str1 referencia o objeto no pool, str3 o novo objeto no heap.
System.out.println(str1 == str3); // false

// Verificação de valores:
// Todas as strings têm o mesmo valor.
System.out.println(str1.equals(str3)); // true

Diferenças na tabela:

Critério Literal de string ("abc") new String("abc")
Local de criação Pool de strings (String Pool) Heap (Heap)
Criação de objeto Retorna um existente ou cria um novo Sempre cria um novo objeto
Otimização de memória Usa eficientemente o pool para repetições Pode criar duplicados, menos eficiente
Comparação de referências (==) Frequentemente true para strings com o mesmo valor Sempre false para strings com o mesmo valor criadas separadamente