String pool, referência de Strings  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
Djonatah
JavaGuru
[Avatar]

Membro desde: 11/05/2007 15:38:09
Mensagens: 204
Localização: São Bento do Sul - SC
Offline

Alguém poderia me explicar porque o código abaixo retorna falso, desde que pela definição há apenas um objeto na String pool?



Obrigado
Abraços

<><

--------------------------------------------------
" Daria tudo o que sei, pela metade do que ignoro " - Descartes

" Tudo tem seu tempo, cada coisa tem sua ocasiao " - Eclesiastes 3
[MSN]
LPJava
GUJ Hacker

Membro desde: 18/04/2006 12:50:23
Mensagens: 5523
Localização: Bahia/Porto Alegre
Offline

retorna falso pq a referencia eh para outro objeto que por acaso tem uma referencia semelhante a anterior. para ser true ai somente usando equals..

flw! feliz ano novo!

Sun Certified Java Programmer 5.0
Blog:http://www.camilolopes.com
Twitter:www.twitter.com/camilolope
Linkedin: http://br.linkedin.com/in/camilolopes
Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
[WWW]
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

Exato. O operador == compara o padrão de bits de cada referência. No caso, cada referência aponta para um objeto diferente, logo o padrão de bits de cada uma delas é diferente.

http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
lavh
GUJ Master

Membro desde: 30/07/2006 16:09:55
Mensagens: 1311
Offline

Djonatah wrote:Alguém poderia me explicar porque o código abaixo retorna falso, desde que pela definição há apenas um objeto na String pool?



Obrigado
Abraços

<><


Realmente deveria ter retornado true. Segue um texto que explica isso em detalhes:

http://www.xyzws.com/javafaq/what-is-string-literal-pool/3

A JVM que você está usando é a da Sun?

Pode ser que pelo motivo do seu código ser bem simples, na hora de compilar, o compilador abriu mão do String Pool, mas não
sei se é isso.

Se alguém souber dar uma resposta precisa!

PS: Pelo que eu entendi, o nosso amigo sabe que pra comparar String ele deve usar o equals, o que ele está querendo entender
é porque o String pool não foi usado no caso dele...

[]s
Djonatah
JavaGuru
[Avatar]

Membro desde: 11/05/2007 15:38:09
Mensagens: 204
Localização: São Bento do Sul - SC
Offline

lach

Exatamente colega
não sei porque...como eu posso saber se minah JVM é da Sun? (eu ó consegui achar a version dela )

Espero mais comentários.

Abraços

--------------------------------------------------
" Daria tudo o que sei, pela metade do que ignoro " - Descartes

" Tudo tem seu tempo, cada coisa tem sua ocasiao " - Eclesiastes 3
[MSN]
Djonatah
JavaGuru
[Avatar]

Membro desde: 11/05/2007 15:38:09
Mensagens: 204
Localização: São Bento do Sul - SC
Offline

rod.attack wrote:Exato. O operador == compara o padrão de bits de cada referência. No caso, cada referência aponta para um objeto diferente, logo o padrão de bits de cada uma delas é diferente.


rod.attack, eu quis dizer que SE existe apenas uma string na minha string pool as referências teriam que ter o mesmo bit pattern, pois se existe apenas um objeto como pode as referências divergirem?

espero que não lhe confundi


Abraços e um feliz ano novo \o/

--------------------------------------------------
" Daria tudo o que sei, pela metade do que ignoro " - Descartes

" Tudo tem seu tempo, cada coisa tem sua ocasiao " - Eclesiastes 3
[MSN]
rodrigo.bossini
GUJ Master
[Avatar]

Membro desde: 01/07/2008 20:59:17
Mensagens: 1055
Offline

Sim, sim, desculpe pela confusão. Quando achar a resposta não deixe de postar.

http://www.rodrigobossini.com.br/

Meu Twitter:@rodrigobossini
Se uma pessoa fala português há 30 anos e ainda não aprendeu, por que é que vou acreditar que ela está programando em alguma linguagem de programação há apenas 10 anos e sabe o que está fazendo?
rc
Thread.start()
[Avatar]

Membro desde: 15/04/2007 21:34:42
Mensagens: 40
Offline

Para mim, como esperado, sempre retorna true, nao importa se compilando com o compilador do Eclipse, ou JDK 1.5, ou 1.6.

Qual o compilador que tu usas?

Rafael Chaves
abstratttechnologies
[WWW]
rc
Thread.start()
[Avatar]

Membro desde: 15/04/2007 21:34:42
Mensagens: 40
Offline

E o teu código de teste é exatamente como tu mostraste? Se estiveres usando constantes, bom, aí as coisas são um pouco diferentes.

This message was edited 1 time. Last update was at 31/12/2008 07:42:32


Rafael Chaves
abstratttechnologies
[WWW]
Djonatah
JavaGuru
[Avatar]

Membro desde: 11/05/2007 15:38:09
Mensagens: 204
Localização: São Bento do Sul - SC
Offline

Hmmm eu fiz uns testes aqui no trabalho e retornou true tbm

Bom, eu tenho rodado os examples (em casa) por uma IDE (JCreator), e não sei qual JVM ela etá usando..

Vou chegar em casa e fazer o teste pela IDE.

Obrigado.

<><

--------------------------------------------------
" Daria tudo o que sei, pela metade do que ignoro " - Descartes

" Tudo tem seu tempo, cada coisa tem sua ocasiao " - Eclesiastes 3
[MSN]
MarceloS
JavaTeenager

Membro desde: 02/06/2008 10:31:11
Mensagens: 185
Offline

Djonatah wrote:Alguém poderia me explicar porque o código abaixo retorna falso, desde que pela definição há apenas um objeto na String pool?


Aqui retorna true...
ricardo13
Virtual Machine Man
[Avatar]

Membro desde: 14/09/2007 10:19:03
Mensagens: 514
Localização: Mococa/São Carlos
Offline

olá pessoal,

Caramba !!! vcs querem fazer confusão na minha cabeça justo agora......faltndo 1 semana para minha SCJP.

Eu tenho "quase" absoluta certeza q é TRUE o resultado.........

Pelo fato q vc ta simplesmente adicionando um literal no pool de String.......

entaum quando vc atribui o primeiro, no caso s1, vc vai estar colocando "ABC" no pool.

na próxima atribuição, no caso s2, ele vai ver c ta no pool para economizar memória para não precisar alocar outro objeto.

dai s1 e s2 vão referenciar o msm objeto.


Agora c vcs me falarem q isso é FALSE........ eu vou ficar maluko hein........kkkkkkkk


Ricardo

/*
* Sun Certified Java Associate 1.0
* Sun Certified Java Programmer 6
* Sun Certified Web Components Development 5
* Bacharelado em Ciência da Computação - UNICEP
* Mestre em Ciência da Computação - ICMC/USP
*/
[MSN]
Djonatah
JavaGuru
[Avatar]

Membro desde: 11/05/2007 15:38:09
Mensagens: 204
Localização: São Bento do Sul - SC
Offline

Pessoal,

Desculpe a confusão, acabei de descobrir que foi um problema operacional MEU

O código acima realmente retorna TRUE. O que eu estava tentando fazer e que retornava FALSE era o seguinte:



Eu não sei o porque ainda, estou tentando descobrir. tenho das sugetões.
1 - O modo que o método println() avalia o argumento
2 - Precendência de operador

CONCLUSÃO
O código do primeiro pos retorna TRUE
mas cuidado com o println ;D

Obrigado pelos posts, e desculpe-me pela confusão

Abraços
<><

--------------------------------------------------
" Daria tudo o que sei, pela metade do que ignoro " - Descartes

" Tudo tem seu tempo, cada coisa tem sua ocasiao " - Eclesiastes 3
[MSN]
MarceloS
JavaTeenager

Membro desde: 02/06/2008 10:31:11
Mensagens: 185
Offline

Djonatah wrote:

Eu não sei o porque ainda, estou tentando descobrir. tenho das sugetões.
1 - O modo que o método println() avalia o argumento
2 - Precendência de operador



Ordem dos operadores:

rc
Thread.start()
[Avatar]

Membro desde: 15/04/2007 21:34:42
Mensagens: 40
Offline

Nota que isso não tem nada a ver com o PrintStream#println, que é um método como todos os outros em Java. As regras para avaliação de expressões são sempre as mesmas independente do contexto em que elas aparecem (inicializando uma variável ou como argumento para um invocação de método).

Rafael Chaves
abstratttechnologies
[WWW]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team