Pessoal estou com duvida em boxing e unboxing...  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Raff
Virtual Machine Man
[Avatar]

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...
[Email] [MSN]
zepunk
JavaTeenager
[Avatar]

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.
[Email] [MSN]
diego2005
GUJ Master
[Avatar]

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
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.


[WWW]
diego2005
GUJ Master
[Avatar]

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
Raff
Virtual Machine Man
[Avatar]

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...
[Email] [MSN]
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
[WWW]
diego2005
GUJ Master
[Avatar]

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+
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team