Questão Autoboxing

8 respostas
Licuri
public class Boxing4 {
    public static void main(String[] args) {
        Integer i = 10;
        Integer j = 10;
        System.out.print(i==j);
        System.out.print(i.equals(j));
    }
}

Qual será a saída?
1)falsefalse
2)truetrue
3)truefalse
4)falsetrue

Outra

public class Boxing5 {
    public static void main(String[] args) {
        Integer i = 200;
        Integer j = 200;
        System.out.print(i==j);
        System.out.print(i.equals(j));
    }
}

Saída ?

1)falsefalse
2)truetrue
3)truefalse
4)falsetrue

8 Respostas

fabiozoroastro

1ª True True
2ª False True.

Você têm que lembrar que na classe Integer números até 128, a jvm pega valores que já estão na memória. A partir de 128 quando vc cria um novo Integer é criado um novo objeto.

Edit.: Entre na classe Integer e observe o método valueOf(). Depois observe o atirbuto:

static final Integer cache[] = new Integer[-(-128) + 127 + 1];

Vai ficar mais claro. :slight_smile:

Abraço.

eltonk

Assim como a Classe Long, o Integer também possui um cache de Objetos de -128 a 127.
Supostamente isso é feito para que os valores mais utilizados já estejam disponível, aumentando a performance do objeto :wink:

Licuri

Cara valeu mesmo, eu não tinha entendido pela explicação do Site…
valeu…

Isso também se aplicaria se eu tivesse -200 ?

fabiozoroastro

Oi Licuri.

Como nosso amigo eltonk disse:

Então somente números menores que 127 e maiores que -128 já estão em cache. O resto é criado uma nova instância mesmo. Beleza? Abraço.

Licuri

certo!!! Valeu… :stuck_out_tongue: :stuck_out_tongue:

ViniGodoy

Só lembrando que esse cache pode variar de VM para VM e não é garantido que esteja no Java nas próximas versões (embora eu ache que se for para acontecer alguma coisa com ele, creio que ele aumentaria, não reduziria).

LPJava

olha no seu primeiro codigo sera:
true
true
e na segunda:
false
true

o ponto a observar é que ate o valor 127 usando a class Integer e == o valor vai retornar true acima desse valor ele retorna false usando == e o equals funciona corretamente pq a class String e Wrappers ja implementa o metodo equals.

eltonk

Só um esclarecimento…
Utilizando ==, você estára perguntando se as referências estão apontando para o mesmo objeto. Ex.

Integer i = new Integer(3000);
   Integer j = i;
   Integer k = new Integer(3000); 
   System.out.println(i==j);//A saída sempre será true
   System.out.println(i==k);//A saída sempre será false

O caso do Licuri foge a regra por tratar-se de objetos já cacheados na JVM que o Integer e o Long (não lembro se mais alguma outra classe também) fazem.

Criado 1 de junho de 2007
Ultima resposta 1 de jun. de 2007
Respostas 8
Participantes 5