| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 00:37:40
|
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
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 00:50:53
|
santos.fernando
JavaEvangelist
![[Avatar]](/images/avatar/f126a36acc1144ddade56fca3cd710f5.jpg)
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 ! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 00:55:50
|
peczenyj
Moderador
![[Avatar]](/images/avatar/299dc35e747eb77177d9cea10a802da2.jpg)
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.' |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 00:57:46
|
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
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 01:25:39
|
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???
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 07:06:57
|
dizanorton
Thread.start()
![[Avatar]](/images/avatar/0396717eb5f268b8b0d243a834e3ddc6.png)
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. */ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 07:09:04
|
dizanorton
Thread.start()
![[Avatar]](/images/avatar/0396717eb5f268b8b0d243a834e3ddc6.png)
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. */ |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 08:11:35
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 08:32:28
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 15/01/2010 10:04:16
|
Sami Koivu
Virtual Machine Man
![[Avatar]](/images/avatar/a4d8e2a7e0d0c102339f97716d2fdfb6.jpg)
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 |
|
|
 |
|
|