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ê???
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”
[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.