Strings  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
christianferraz
Smalltalk

Membro desde: 15/01/2010 00:35:44
Mensagens: 3
Offline

Na classe abaixo:



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ê????

This message was edited 1 time. Last update was at 15/01/2010 00:38:48

santos.fernando
JavaEvangelist
[Avatar]

Membro desde: 28/02/2007 20:14:15
Mensagens: 487
Localização: Curitiba
Offline

Se eu entendi bem a sua dúvida, lá vai a resposta.
c==d é true, porque c vai conter a referencia de (a+b), isto está sendo feito nesse trecho

e d também vai conter a referencia de (a+b)

c e d estão referenciando os mesmos objetos.

This message was edited 2 times. Last update was at 15/01/2010 00:52:25


Deus não escolhe os capacitados, mas capacita os escolhidos !
peczenyj
Moderador
[Avatar]

Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline

Pode ser pelo pool de strings.

para serem diferentes deveria pelo menos ser assim

String c = a+b;
String d = new String(a+b);

http://pacman.blog.br

'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.'
[WWW]
christianferraz
Smalltalk

Membro desde: 15/01/2010 00:35:44
Mensagens: 3
Offline

Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???

This message was edited 2 times. Last update was at 15/01/2010 01:26:08

christianferraz
Smalltalk

Membro desde: 15/01/2010 00:35:44
Mensagens: 3
Offline

christianferraz wrote:Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???
dizanorton
Thread.start()
[Avatar]

Membro desde: 04/01/2010 09:14:32
Mensagens: 41
Localização: Sintra, Portugal
Offline

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"

o mesmo se passa com o "c==d".

/* discussão é coisa de mulheres. os homens debatem ou se batem. */
dizanorton
Thread.start()
[Avatar]

Membro desde: 04/01/2010 09:14:32
Mensagens: 41
Localização: Sintra, Portugal
Offline

"final String a" armazena uma referencia constante para a String a (não altera)
essa é a minha idéia...
tó aberto a correções dos gurus

/* discussão é coisa de mulheres. os homens debatem ou se batem. */
renamed
GUJ Ranger

Membro desde: 21/09/2009 08:47:57
Mensagens: 889
Localização: Rio de Janeiro
Offline

http://www.guj.com.br/posts/list/32457.java#592987

vale a pena ler

flw!
===========================

CV: http://lattes.cnpq.br/7235056457600426
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

christianferraz wrote:Agora, por que quando eu tiro a palavra final ele passa
para true,false,false???


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.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Sami Koivu
Virtual Machine Man
[Avatar]

Membro desde: 16/09/2004 09:49:27
Mensagens: 574
Localização: Curitiba-PR
Offline

Para ver que o ViniGodoy tem razão, basta decompilar as duas versões (com e sem final) da classe.

[]s,
Sami

(Slightly) Random Broken Thoughts on Java Security
[Email] [WWW] [Yahoo!] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team