Que vacilo, as referências apontam para as mesmas String, afinal todas elas estão no pools, básico !!!
D
DaviPiala
Só pra deixar mais claro vai esse exemplo simples
//Novo Objeto String - falseStringcarro=newString("audi");System.out.println(carro=="audi");//Referencia está apontando para string do pool - truecarro="audi";System.out.println(carro=="audi");
T
thingol
O código que você postou é equivalente ao seguinte código, para o compilador:
É 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.
rmendes08
Na verdade não entendi pq você achou que seria false,false
T
thingol
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.
pintofree
So retornaria True True se estivesem sendo comparadas utilizando o equals, que no caso compara o valor da String.
victorwss
Você não entendeu a pegadinha. Ele retorna true, true mesmo sem usar o equals!
gomesrod
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).
Porém, o grande Thingol mais uma vez salva o dia:
pintofree
pintofree:
So retornaria True True se estivesem sendo comparadas utilizando o equals, que no caso compara o valor da String.
viajei na maionese aki pessoal, desculpa e a fome.
O resultado é true, pois com o recurso de pool de Strings, s1 e s2 referenciam o mesmo objeto, é isso?
Luiz-SP
Muito bem explicado pelo thingol
Luiz-SP
rmendes08:
hmmmm … entendi! se eu tivesse algo do tipo
O resultado é true, pois com o recurso de pool de Strings, s1 e s2 referenciam o mesmo objeto, é isso?
é isso sim.
Luiz-SP
ops!
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:
Luiz-SP
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:
Olá Bani, vc corrigiu meus programas em Mac122, blz?