Boxing e unBoxing Questão diferente

5 respostas
M
Referente ao código abaixo:
class test {
   public static void main(String[] args) {
      test inst_test = new test();
      int i1 = 2000;
      int i2 = 2000;
      int i3 = 2;
      int i4 = 2;
      inst_test.method( i3 , i4 );
      inst_test.method( i1 , i2 ); 
   }
   public void method( Integer i , Integer eye ) {
      System.out.println(i == eye );
   }
}

pra mim a saída seria false e false.
Pois quando entra no method a variavel primitiva int passa por boxing e se Transforma em um Integer, e como no == ele compara a referência desses Objetos avaliei como False, mas a saída foi true e false.
Qual a explicação pra isso?
existe uma regra, lí em algum topico q numero acima de 127 tem uma regra.... e se tem... tenho que me preocupar com questões assim na prova de certificação?

5 Respostas

taaqui

Não é possivel comparar int maiores que 127.

Mikhas

to sabendo disso não. Explica melhor.

A respeito do código, o compilador java sabe que na hora de comparar os objetos do tipo java.lang.Integer, na verdade ele tem que comprar o valor numérico e não as referencias.

Mas esse lance do 127 eu não to sabendo não… vou dar uma pesquisada.

sergiolopes

Algumas implementacoes da classe Integer (a da Sun, por exemplo) fazem um cache de objetos para valores “pequenos” de Integers. O auto-boxing quando executado na verdade faz uma chamada a Integer.valueOf(int) que usa esse cache. Na VM da Sun o cache vai de -128 a 127.

Olha o código fonte da classe Integer da Sun. Veja na linha 601 o método valueOf e a chamada do cache. Aliás na linha 578 voce encontra a classe interna IntegerCache que faz justo isso.

Mas duvido que na SCJP caia esse tipo de coisa até porque isso é detalhe de implementação (nem o javadoc fala disso). E lembre que comparação de Integer deve ser feita com equals sempre, já que são objetos. Se fizer assim, nunca terá problemas.

[]'s

moacirjava

Essa regra é válida somente para ints ou outros tipos tem uma limitação igual?

E

Tanto é que é apenas um detalhe de implementação, que na versão 7 do JDK será possível passar um daqueles famosos parâmetros -XX alguma coisa para poder ajustar o tamanho desse cache. (Não me lembro mais em que build isso foi acrescentado). Portanto não faz sentido você decorar que o tal cache vai de -128 até +127 (no caso dos tipos int, short, long, byte) ou de (char) 0 a (char) 127 (no caso do tipo char). Não faz sentido algum.

Criado 20 de setembro de 2009
Ultima resposta 21 de set. de 2009
Respostas 5
Participantes 6