Dúvida questão [RESOLVIDO]  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
evertonsilvagomesjava
GUJ Master
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 1924
Offline



Galera pq o teste de == ali retorna false? Eu sei que o metodo intValue() retorna um int e que == analisa a referencia na memoria porém se comparado um Integer com um int se ambos tiverem o mesmo valor retorna true como por exemplo:


Então pq o retorno e falso no teste dentro do método?

This message was edited 1 time. Last update was at 08/02/2010 15:01:07

douglas_vidotto
JavaTeenager
[Avatar]

Membro desde: 12/08/2008 15:43:18
Mensagens: 195
Offline

Acredito que seja por isso... dentro de methodA() você possui duas variáveis referenciando um objeto Integer cujo valor é 25. Essas variáveis são startingI e i. Depois você chama methodB() passando como argumento a variável i. Ao fazer isso, agora você tem 3 variáveis apontando para o objeto Integer cujo valor é 25: startingI, i e i2. Porém, em methodB() você faz o seguinte comando: i2 = i2.intValue();. Nesse ponto acredito que ocorra um boxing do valor retornado por intValue() criando um novo objeto Integer. Assim, startingI e i2 apontam para objetos diferentes na memória, mas que possuem o mesmo valor. Por isso no seu teste de == o valor é falso.


Edit: Para finalizar.. no seu outro teste:


Isso acontece por que ocorre um unboxing do valor do objeto referenciado por a. Assim temos dois ints sendo comparados. Aí, como o valor é o mesmo, == retorna true

This message was edited 1 time. Last update was at 08/02/2010 10:12:13

evertonsilvagomesjava
GUJ Master
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 1924
Offline

Não sabia que ele iria criar um novo objeto ali não...



E criado entao um novo objeto integer? Pq na realidade ele ta fazendo um unboxing de Integer pra int...
mario.fts
GUJ Ranger
[Avatar]

Membro desde: 14/05/2008 09:41:06
Mensagens: 817
Localização: São Paulo - ZL
Offline

Na realidade vc ta fazendo de Integer pra int e pra Integer de novo, pq a variável i2 é do tipo Integer.

Mário Amaral Gonçalves

"Ciência da computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas." - Edsger Dijkstra
[Email]
evertonsilvagomesjava
GUJ Master
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 1924
Offline

hum é isso mesmo, unboxing de Integer pra int e boxing de int pra Integer de novo, mas nao entendo pq ele cria um novo objeto...

This message was edited 1 time. Last update was at 08/02/2010 10:29:19

douglas_vidotto
JavaTeenager
[Avatar]

Membro desde: 12/08/2008 15:43:18
Mensagens: 195
Offline

Ele cria um novo objeto porque toda vez que ele faz um boxing, ocorre um processo parecido com isso (pelo que está no livro da Kathy Sierra):

This message was edited 1 time. Last update was at 08/02/2010 10:38:41

evertonsilvagomesjava
GUJ Master
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 1924
Offline

hum ok vlw.
Metal Java Full
JavaTeenager
[Avatar]

Membro desde: 09/11/2009 11:42:27
Mensagens: 195
Localização: Fortaleza - CE
Offline

Dizer que um objeto (startingI) não pode ser comparado com uma variável primitiva (i2 = i2.intValue()) com == , faz algum sentido??

Graduação em Análise de Sistemas - Fortaleza (CE)
Sun Certified Programmer for the Java Platform, Standard Edition 6.0
Visitem meu Blog
"Reduza a Velocidade - Travessia de Modems 2400bps." OS VIGARISTAS - Frases de Informática
[Email] [MSN]
evertonsilvagomesjava
GUJ Master
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 1924
Offline

Nao faz pq vc pode comparar com == que da true, a questao e que realmente ele criou um novo objeto.

Se vc fizer um teste vera que da true:

mario.fts
GUJ Ranger
[Avatar]

Membro desde: 14/05/2008 09:41:06
Mensagens: 817
Localização: São Paulo - ZL
Offline

se no unboxing ele usar new Integer(10), ele vai criar um novo:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#Integer(int)

Constructs a newly allocated Integer object that represents the specified int value.


Vc tem que considerar tbm o fator de cache do integer.



PQ? pq o Integer tem um cache interno de objetos, até o 127. Os objetos maiores que 127 são criados dinamicamente.

This message was edited 1 time. Last update was at 08/02/2010 12:50:44


Mário Amaral Gonçalves

"Ciência da computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas." - Edsger Dijkstra
[Email]
Metal Java Full
JavaTeenager
[Avatar]

Membro desde: 09/11/2009 11:42:27
Mensagens: 195
Localização: Fortaleza - CE
Offline

Noossaa!!!!
Preciso anotar essa!
Mto boa!

vlew

Graduação em Análise de Sistemas - Fortaleza (CE)
Sun Certified Programmer for the Java Platform, Standard Edition 6.0
Visitem meu Blog
"Reduza a Velocidade - Travessia de Modems 2400bps." OS VIGARISTAS - Frases de Informática
[Email] [MSN]
stone010
Thread.start()
[Avatar]

Membro desde: 16/10/2008 09:27:32
Mensagens: 34
Offline

Por um acaso cai neste tópico e notei que há um pequeno equívoco que pode gerar confusão no entendimento de algumas pessoas. Deixarei meu comentário pois pode servir como referência.

Nem SEMPRE que é feito um boxing, o new Integer() é chamado.

Antes de mais nada é realizada uma verificação no cache, para ver se já foi feito algum outro boxing que bata com o mesmo tipo e valor deste, até o limite do valor de 127. Se já existe, NÃO é feito o new Integer().

Neste caso a variável em questão, apenas referencia o mesmo endereço de memória do objeto já existente no cache.

Não se ater a este "detalhe" pode nos confundir pelo seguinte motivo:

Resultado: true. Pois a variável "b" apenas apontou para o mesmo objeto armazenado no cache outrora criado pela variável "a". Então "b" "aponta" para o mesmo objeto no Heap que "a". Logo podem-se considerar iguais.

enquanto:

Resulta em false. Pois até a linha 3 ainda não tinha sido criado nenhum objeto utilizando a estratégia boxing, logo não existia nada armazenado no cache. Neste caso sim é feito o new Integer() criando um novo endereço de memória. Então após a linha 3, a variável "a" e "b" são objetos diferentes.

No caso do exemplo original o parâmetro que methodB() recebe não foi criado através de boxing. Apenas frisando, como "i" foi criado da forma mais completa (Integer i = new Integer(25)), nada foi armazenado no cache, então ao fazer o boxing na variável "i2", a classe Integer não encontra nada no cache, então o Construtor (new Integer(25)) é chamado, criando um novo objeto. Por isso o código retorna false.

...
Integer i = new Integer(25);
...
methodB(i);
...

private void methodB(Integer i2) {
i2 = i2.intValue(); //não há cache, então cria um novo Integer.
System.out.println(this.startingI == i2) //retorna false, os objetos são diferentes.


Apenas como um exemplo, com o simples processo de alterar a linha que cria "Integer i = new Integer(25)" para "Integer i = 25", já seria o suficiente para o código retornar true, ao invés de false, já que a linha "i2 = i2.intValue()" não faria um new Integer(), mas sim usaria o mesmo endereço de memória que a variável "i" estaria "apontando".

This message was edited 31 times. Last update was at 27/08/2010 13:24:36

evertonsilvagomesjava
GUJ Master
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 1924
Offline

stone010 wrote:Por um acaso cai neste tópico e notei que há um pequeno equívoco que pode gerar confusão no entendimento de algumas pessoas. Deixarei meu comentário pois pode servir como referência.

Nem SEMPRE que é feito um boxing, o new Integer() é chamado.

Antes de mais nada é realizada uma verificação no cache, para ver se já foi feito algum outro boxing que bata com o mesmo tipo e valor deste, até o limite do valor de 127. Se já existe, NÃO é feito o new Integer().

Neste caso a variável em questão, apenas referencia o mesmo endereço de memória do objeto já existente no cache.

Não se ater a este "detalhe" pode nos confundir pelo seguinte motivo:

Resultado: true. Pois a variável "b" apenas apontou para o mesmo objeto armazenado no cache outrora criado pela variável "a". Então "b" "aponta" para o mesmo objeto no Heap que "a". Logo podem-se considerar iguais.

enquanto:

Resulta em false. Pois até a linha 3 ainda não tinha sido criado nenhum objeto utilizando a estratégia boxing, logo não existia nada armazenado no cache. Neste caso sim é feito o new Integer() criando um novo endereço de memória. Então a variável "a" e "b" são objetos diferentes.

No caso do exemplo original o parâmetro que methodB() recebe não foi criado através de boxing. Apenas frisando, como "i" foi criado da forma mais completa (Integer i = new Integer(25)), nada foi armazenado no cache, então ao fazer o boxing na variável "i2", a classe Integer não encontra nada no cache, então o Construtor (new Integer(25)) é chamado, criando um novo objeto. Por isso o código retorna false.

private void methodB(Integer i2) {
i2 = i2.intValue(); //não há cache, então cria um novo Integer.
System.out.println(this.startingI == i2) //retorna false, os objetos são diferentes.


Apenas como um exemplo, com o simples processo de alterar a linha que cria "Integer i = new Integer(25)" para "Integer i = 25", já seria o suficiente para o código retornar true, ao invés de false, já que a linha "i2 = i2.intValue()" não faria um new Integer(), mas sim usaria o mesmo endereço de memória que a variável "i" estaria "apontando".


Mto boa explicação.
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team