class Green {
public static void main(String args[]) {
final String a = "A";
final String b = "B";
String c = a+b;
String d = a+b;
System.out.print((c==c) + ",");
System.out.print(((a+b)==(a+b)) + ",");
System.out.print(c==d);
}
}
gostaria de saber por que na saída de System.out.println será “true,true,true” se a comparação de Strings == é pela referência e não pelo valor.
Pelo que eu sei String c = a+b, é criada uma referência String a+b e String c = a+b, é criado outra referência para d. Agora na saída c==d = true. Por quê???
Se eu entendi bem a sua dúvida, lá vai a resposta.
c==d é true, porque c vai conter a referencia de (a+b), isto está sendo feito nesse trecho
Stringc=a+b;
e d também vai conter a referencia de (a+b)
Stringd=a+b;
c e d estão referenciando os mesmos objetos.
peczenyj
Pode ser pelo pool de strings.
para serem diferentes deveria pelo menos ser assim
String c = a+b; String d = new String(a+b);
C
christianferraz
Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???
C
christianferraz
christianferraz:
Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???
dizanorton
ao meu ver as referencias aos objectos sao feitas na memória, portanto:
“c==c” é o mesmo objecto (referencia, ou lugar na memória), daí o “true”
o primeiro “a+b”, cria uma referencia numa localização de memória
o segundo “a+b”, cria outra referencia numa outra localização de memória, daí o “false”
o mesmo se passa com o “c==d”.
dizanorton
“final String a” armazena uma referencia constante para a String a (não altera)
essa é a minha idéia…
tó aberto a correções dos gurus
Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???
Trata-se de uma otimização. Apenas com o final o compilador tem absoluta certeza de que a+b retornarão sempre a referência para a mesma área de memória, nesse caso, a mesma string. Caso contrário, uma das variáveis poderia ter mudado de valor no meio do caminho e, por isso, ele criará uma string nova em cada caso.
Sami_Koivu
Para ver que o ViniGodoy tem razão, basta decompilar as duas versões (com e sem final) da classe.