Sobes.tech
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 String nã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 String com 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 com new String, o operador == retornará false, pois são objetos diferentes. Para comparar o conteúdo das strings, deve-se sempre usar o método equals().

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)