| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2007 15:39:30
|
Raff
Virtual Machine Man
![[Avatar]](/images/avatar/1f8d87e1161af68b81bace188a1ec624.png)
Membro desde: 31/07/2006 10:31:45
Mensagens: 642
Localização: Marilia - SP / São Carlos -SP
Offline
|
Dado o codigo a baixo por os dois resultados não são true ?
|

SCJP 5.0
SCWCD 5.0
Mestrando UFSCAR... |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2007 15:44:42
|
zepunk
JavaTeenager
![[Avatar]](/images/avatar/c5c3d4fe6b2cc463c7d7ecba17cc9de7.jpg)
Membro desde: 24/05/2005 11:57:28
Mensagens: 198
Localização: Osasco
Offline
|
Para comparar objetos deve-se utilizar o equals, mesmo com o boxing não deixa de ser objetos.
|
Perseverança sozinha não ganha guerra, só palavras não conquistam um coração. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2007 15:45:53
|
diego2005
GUJ Master
![[Avatar]](/images/avatar/7fd4db88d31ab524e0afe153c4f9465a.jpeg)
Membro desde: 17/08/2005 10:11:05
Mensagens: 1095
Offline
|
Por que o operador de igualdade compara referências, e não valores.
Para comparar valores use o método equals()...
T+
|
SCJP 1.4
Meu Currículo |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2007 15:48:22
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
No primeiro caso, há autoboxing, e note que "Byte b1 = 5" não é equivalente a "Byte b1 = new Byte (5)" e sim "Byte b1 = Byte.valueOf (5)", que reaproveita um java.lang.Byte.
No segundo caso não há autoboxing e não há reaproveitamento de objetos.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2007 15:51:38
|
diego2005
GUJ Master
![[Avatar]](/images/avatar/7fd4db88d31ab524e0afe153c4f9465a.jpeg)
Membro desde: 17/08/2005 10:11:05
Mensagens: 1095
Offline
|
Compilei o código aqui e vi que o resultado é:
true
false
e não
false
false
como eu esperava.
Mais uma aula do Thingol...
|
SCJP 1.4
Meu Currículo |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2007 16:36:11
|
Raff
Virtual Machine Man
![[Avatar]](/images/avatar/1f8d87e1161af68b81bace188a1ec624.png)
Membro desde: 31/07/2006 10:31:45
Mensagens: 642
Localização: Marilia - SP / São Carlos -SP
Offline
|
Thingol eu pensava que como esses wrapper tem o mesmo valor eles referenciariam o mesmo Objeto . Mas essa questão de reaproveitar Objeto você poderia me explicar melhor ???
|

SCJP 5.0
SCWCD 5.0
Mestrando UFSCAR... |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2007 16:43:59
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Vamos lá.
Wrapper não tem nada de mágico; é só um objeto que encapsula ("embrulha") um tipo primitivo.
Quando você usa "new", sempre é criado um novo objeto - sem dó nem piedade. Sempre.
Só que quando você usa wrappers, o Java já deixa prontos 256 objetos (de -128 a +127) já "pré-alocados" para poder usar com o método valueOf. Isso vale para Integer, Short, Byte e Long. (Para Boolean ele deixa pronto Boolean.TRUE e Boolean.FALSE; e para Character ele deixa pronto de (char) 0 até (char) 127.)
Se você usar valueOf, ou então ocorrer o autoboxing (que é uma forma disfarçada de chamar valueOf), ele primeiro vê se o valor que você está pedindo está entre -128 e +127. Se estiver, ele lhe retorna um desses objetos já pré-alocados. Se não estiver, ele simplesmente chama "new", mesmo que você já tenha usado o valor antes.
Exemplo:
Atenção - isso não deve cair em sua certificação. É só um detalhe de implementação.
Para comparar corretamente dois wrappers, use equals, que compara os valores, não as referências dos objetos
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2007 16:57:31
|
diego2005
GUJ Master
![[Avatar]](/images/avatar/7fd4db88d31ab524e0afe153c4f9465a.jpeg)
Membro desde: 17/08/2005 10:11:05
Mensagens: 1095
Offline
|
thingol wrote:
Atenção - isso não deve cair em sua certificação. É só um detalhe de implementação.
Para comparar corretamente dois wrappers, use equals, que compara os valores, não as referências dos objetos
Pode ser que sim, mas no livro da Kathy ela fala sobre isso, segue o trecho:
It's just two wrapper objects that happen to have the same value. Because they have the same int value, the equals() method considers them to be "meaningfully equivalent", and therefore returns true. How about this one:
Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same object");
if(i3.equals(i4)) System.out.println("meaningfully equal");
This example produces the output:
same object
meaningfully equal
Yikes! The equals() method seems to be working, but what happened with = = and != ? Why is != telling us that i1 and i2 are different objects, when = = is saying that i3 and i4 are the same object? In order to save memory, two instances of the following wrapper objects will always be = = when their primitive values are the same:
Boolean
Byte
Character from \u0000 to \u007f (7f is 127 in decimal)
Short and Integer from -128 to 127
T+
|
|
|
 |
|
|