Junior
Qual é a diferença entre criar uma string usando aspas duplas e chamar o construtor new String?
sobes.tech IA
Resposta da IA
Ao criar uma string usando aspas duplas ("string"), a JVM procura no pool de strings (String Pool) uma string com o mesmo conteúdo. Se encontrar, retorna uma referência ao objeto existente. Caso contrário, cria um novo objeto de string no pool e retorna a referência. Isto otimiza o uso de memória, pois literais de string iguais apontam para o mesmo objeto.
Ao criar uma string usando o construtor new String("string"), um novo objeto de string é sempre criado fora do pool de strings, mesmo que já exista uma string com o mesmo conteúdo no pool.
Diferenças:
- Pool de strings: Aspas duplas usam o pool de strings,
new Stringnão. - Performance: Usar aspas duplas é geralmente mais rápido, pois permite reutilizar objetos existentes.
- Número de objetos: Aspas duplas podem levar a um menor número de objetos de string na memória em comparação com o uso repetido de
new Stringcom o mesmo conteúdo. - Comparação:
- Ao comparar strings criadas com aspas duplas com o mesmo conteúdo, o operador
==retornarátrue, pois apontam para o mesmo objeto. - Ao comparar strings criadas com
new String(mesmo com o mesmo conteúdo) ou strings criadas com aspas duplas, com uma string criada comnew String, o operador==retornaráfalse, pois são objetos diferentes. Para comparar o conteúdo das strings, deve-se sempre usar o métodoequals().
- Ao comparar strings criadas com aspas duplas com o mesmo conteúdo, o operador
Exemplo:
// Criada no pool de strings (ou reutilizada)
String s1 = "abc";
// Criada no pool de strings (reutiliza o objeto "abc" do pool)
String s2 = "abc";
// Cria um novo objeto fora do pool de strings
String s3 = new String("abc");
// Cria um novo objeto fora do pool de strings
String s4 = new String("abc");
// s1 == s2 -> true (apontam para o mesmo objeto no pool)
// s1 == s3 -> false (objetos diferentes)
// s3 == s4 -> false (objetos diferentes)
// s1.equals(s2) -> true (conteúdo igual)
// s1.equals(s3) -> true (conteúdo igual)
// s3.equals(s4) -> true (conteúdo igual)