Olha que pegadinha nesse código!  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
LuizClaudio
JavaEvangelist
[Avatar]

Membro desde: 03/04/2006 21:50:51
Mensagens: 388
Offline

Olá Pessoal

Eu poderia jurar que o código abaixo imprimiria: "false,false", mas imprime "true,true" .Alguém sabe explicar pq?

This message was edited 1 time. Last update was at 17/06/2008 18:02:53


"Porque Deus amou o mundo de tal maneira que deu seu filho unigênito para que todo aquele que nele crê não pereça, mas tenha vida eterna." João 3.16
[WWW]
Adolfo Rodrigues
Java Ninja
[Avatar]

Membro desde: 18/04/2007 20:02:52
Mensagens: 270
Localização: Sampa
Offline

Em java, Strings são imutáveis. Procure nos artigos do GUJ ou no blog da Caelum (não lembro onde eu vi) que tem uma explicação muito legal.

http://www.adolfosousa.com.br/blog
[WWW] [MSN]
RafaelViana
GUJ Master

Membro desde: 23/03/2008 18:56:02
Mensagens: 1257
Localização: Venâncio Aires/RS
Offline

Olha não sei está certo, mas se você juntar a String "A" + "B" vai ficar AB, tipo se fizer "8" + "9" fica 89, vai uma string atrás da outra.

portanto "A" + "B" == "AB"
e
"A" + "B" == c (c == "AB")
mesma coisa que acima...

Rafael Rodrigues Viana
Estudando Java e Flex
Blog: http://www.cauirs.com.br/rafael/

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
[Email] [MSN]
maquiavelbona
JWizard
[Avatar]

Membro desde: 29/06/2006 09:06:51
Mensagens: 2447
Localização: São Paulo - SP
Offline

O grande causo é o pool de Strings.
RafaelViana, você está parcialmente enganado. Quer um exemplo? Rode:

E veja se vai dar true.

Tem um site que achei que acho que a explicação está boa:
http://www.xyzws.com/javafaq/what-is-string-literal-pool/3

Até!

This message was edited 1 time. Last update was at 17/06/2008 21:08:13


----------------------------------------------------------------
"Within a few years a simple and inexpensive device, readily carried about, will enable one to receive on land or sea the principal news, to hear a speech, a lecture, a song or play of a musical instrument, conveyed from any other region of the globe. "
Nikola Tesla - A means for furthering Peace (1905)

"Gedanken ohne Inhalt sind leer, Anschauungen ohne Begriffe sind blind."
Immanuel Kant - Kritik der reinen Vernunft (1781)
LuizClaudio
JavaEvangelist
[Avatar]

Membro desde: 03/04/2006 21:50:51
Mensagens: 388
Offline

Que vacilo, as referências apontam para as mesmas String, afinal todas elas estão no pools, básico !!!

"Porque Deus amou o mundo de tal maneira que deu seu filho unigênito para que todo aquele que nele crê não pereça, mas tenha vida eterna." João 3.16
[WWW]
DaviPiala
Virtual Machine Man
[Avatar]
Membro desde: 17/08/2007 19:17:35
Mensagens: 598
Localização: São Paulo
Offline

Só pra deixar mais claro vai esse exemplo simples




Si temi more regat
Efamima dove tore
Infata dio re
Infa lati plastire
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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.
[WWW]
rmendes08
GUJ Master
[Avatar]

Membro desde: 29/05/2008 14:09:28
Mensagens: 1618
Offline

Na verdade não entendi pq você achou que seria false,false

"A Técnica é transformada em Arte por quem a emprega"

"O futuro pertence àqueles que acreditam na beleza de seus sonhos"

Computadores Fazem Arte

http://www.uaijug.com.br

"É importante estabelecer uma estrutura de alto nível, mas isso não significa criar uma infinidade de diagramas de classes detalhados."
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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.
[WWW]
pintofree
Virtual Machine Man
[Avatar]

Membro desde: 19/12/2007 12:44:42
Mensagens: 651
Localização: Cuiabá - MT
Offline

So retornaria True True se estivesem sendo comparadas utilizando o equals, que no caso compara o valor da String.

SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer, Enterprise Edition 5

"When the compiler's not happy, ain't nobody happy."

[Email] [MSN]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

pintofree wrote:So retornaria True True se estivesem sendo comparadas utilizando o equals, que no caso compara o valor da String.


Você não entendeu a pegadinha. Ele retorna true, true mesmo sem usar o equals!

Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
gomesrod
GUJ Ranger
[Avatar]

Membro desde: 11/05/2007 19:46:22
Mensagens: 901
Offline

rmendes08 wrote:não entendi pq você achou que seria false,false


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:
thingol wrote:É 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.

This message was edited 1 time. Last update was at 18/06/2008 12:04:58

pintofree
Virtual Machine Man
[Avatar]

Membro desde: 19/12/2007 12:44:42
Mensagens: 651
Localização: Cuiabá - MT
Offline

pintofree wrote: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.

SCJP - Sun Certified Java Programmer
SCWCD - Sun Certified Web Component Developer, Enterprise Edition 5

"When the compiler's not happy, ain't nobody happy."

[Email] [MSN]
rmendes08
GUJ Master
[Avatar]

Membro desde: 29/05/2008 14:09:28
Mensagens: 1618
Offline

hmmmm ... entendi! se eu tivesse algo do tipo



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



O resultado é true, pois com o recurso de pool de Strings, s1 e s2 referenciam o mesmo objeto, é isso?

"A Técnica é transformada em Arte por quem a emprega"

"O futuro pertence àqueles que acreditam na beleza de seus sonhos"

Computadores Fazem Arte

http://www.uaijug.com.br

"É importante estabelecer uma estrutura de alto nível, mas isso não significa criar uma infinidade de diagramas de classes detalhados."
LuizClaudio
JavaEvangelist
[Avatar]

Membro desde: 03/04/2006 21:50:51
Mensagens: 388
Offline

rmendes08 wrote:Na verdade não entendi pq você achou que seria false,false


Muito bem explicado pelo thingol

"Porque Deus amou o mundo de tal maneira que deu seu filho unigênito para que todo aquele que nele crê não pereça, mas tenha vida eterna." João 3.16
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team