Strings

Na classe abaixo:

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

String c = a + b;

e d também vai conter a referencia de (a+b)

String d = a + b;

c e d estão referenciando os mesmos objetos.

Pode ser pelo pool de strings.

para serem diferentes deveria pelo menos ser assim

String c = a+b;
String d = new String(a+b);

Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???

[quote=christianferraz]Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???[/quote]

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”.

“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

http://www.guj.com.br/posts/list/32457.java#592987

vale a pena ler

[quote=christianferraz]Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???[/quote]

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.

Para ver que o ViniGodoy tem razão, basta decompilar as duas versões (com e sem final) da classe.

[]s,
Sami