Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Programmer I: Operadores :: Aula 10

(Aula: Teste a igualdade entre Strings e outros objetos usando == e equals() - Parte 2 )

Dúvida:

1)

String ab = "a" + "b";   // ***são 3 objetos??  -> ***  **"a"**, **"b"** e **ab** 

System.out.println(ab == "ab");  // 0 <br />

aqui teríamos o total de 3 objetos? Três literais na primeira, e na segunda nenhum objeto seria criado?

A dúvida é mais quanto à contagem de objetos, não sobre ser literal ou não.

4 respostas

não está formatando direito..mas enfim. acho q dá pra entender

solução!

Olá Herbert,

Isso mesmo, no total ficariam 3 objetos, todas Strings no pool de Strings da JVM. Veja só.

1º Objeto => Literal "a" (criado e incluído no pool) 2º Objeto => Literal "b" (criado e incluído no pool) 3º Objeto => concatenação de "a" com "b" formando "ab" (criado e incluído no pool)

Quando chega na linha seguinte, para imprimir o resultado da comparação da variável ab com a literal "ab", nenhum objeto é criado, pois o Java entende que a literal "ab" já existe no pool de Strings, devido a linha anterior, e acaba devolvendo o mesmo objeto.

Por isso, inclusive, que na saída do console imprime "true", pois trata-se do mesmo objeto em ambos lados do operador "=="

EDIT: Curiosamente, experimente mudar o código para o seguinte:

String ab = new String("a" + "b"); 
System.out.println(ab == "ab");  // 0 <br />

Veja que o resultado vai dar false no fim, e no total teremos 4 objetos, sendo 3 no pool de strings (as literais "a" e "b" e o resultado da concatenação de "a" com "b") e um novo (com conteúdo "ab") que se comportará como qualquer outro objeto criado no Heap.

os 4 na primeira linha, certo?

desculpe comentar aqui, sei que a questão já está fechada, mas só pra não ter q explicar

Isso Herbert, os 4 na primeira linha... Na segunda, o literal "ab" vai se referenciar à String "ab" criada no pool através da concatenação de "a" com "b" da primeira linha.