O código que você postou é equivalente ao seguinte código, para o compilador:
class Orange {
public static void main(String args[]) {
String a = "A";
String b = "B";
String c = "AB";
System.out.print((("AB")=="AB") + ",");
System.out.print(("AB")==c);
}
}
É que quando você tem concatenação de constantes strings, o compilador entende que você quer na verdade é uma outra constante string, que seja o resultado da concatenação.
E como sabemos que as constantes strings estão no pool, então o resultado é “true”, “true”.
Mas isso é na verdade um detalhe de implementação; você precisa procurar na JLS (Java Language Specification) se isso é requerido pela definição da linguagem ou não.
Seria false, false se não houvesse esse recurso de constantes strings estarem no pool. Dessa forma, o operador “==” iria sempre retornar false porque , como sabemos, normalmente objetos com o mesmo conteúdo mas comparados com “==” retornam false, porque não são o mesmo objeto.
== compara referências de objetos, não conteúdo de objetos.
Na verdade eu também achei, e o motivo é o seguinte:
À primeira vista, a impressão é que ao fazer “A”+“B” seria gerado um novo objeto String (tem aquela história de fazer a operação usando StringBuffer…). Este objeto teria o valor “AB”, mas não seria a mesma instância da literal “AB” (que está no pool).
[quote=pintofree]So retornaria True True se estivesem sendo comparadas utilizando o equals, que no caso compara o valor da String.[/quote] viajei na maionese aki pessoal, desculpa e a fome.
class Inteiro{
private int value;
public Inteiro( int v ){ value = v };
}
class Test
{
public void test()
{
Inteiro i1 = new Inteiro( 5 );
Inteiro i2 = new Inteiro( 5 );
System.out.println( i1 == i2 );
}
}
O resultado seria false, pois i1 e i2 referenciam objetos diferentes, mas com o mesmo valor. Porém , no caso das Strings, se eu tiver
class Test
{
public void test()
{
String s1 = "abc";
String s2 = "abc";
System.out.println( s1 == s2 );
}
}
O resultado é true, pois com o recurso de pool de Strings, s1 e s2 referenciam o mesmo objeto, é isso?
hmm… Até a última vez que chequei (que foi há muitos anos atrás) a especificação do Java dizia que você não podia “confiar” no pool de Strings, que o comportamento é indeterminado. Ou seja, uma implementação do Java pode realmente reaproveitar o objeto sempre que possível e outra pode reaproveitar só quando der vontade, e ambas poderiam ser chamadas de “Java compatible”.
[quote=Bani]hmm… Até a última vez que chequei (que foi há muitos anos atrás) a especificação do Java dizia que você não podia “confiar” no pool de Strings, que o comportamento é indeterminado. Ou seja, uma implementação do Java pode realmente reaproveitar o objeto sempre que possível e outra pode reaproveitar só quando der vontade, e ambas poderiam ser chamadas de “Java compatible”.
Isso mudou? :hunf: [/quote]
Olá Bani, vc corrigiu meus programas em Mac122, blz?