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 |