[RESOLVIDO] - Comparar int com Integer

6 respostas
ECO2004

O código abaixo está imprimindo int e Integer são iguais.

Integer integer_n = 2; //autoboxing.
		
int m = 2;
		
System.out.println(m==integer_n?"int e Integer são Iguais":"int e Integer são Diferentes");

Quando utilizo o operador == com objetos, estou comparando o endereço de memória. Se os objetos comparados estiverem apontando para o mesmo endereço de memória, então será retornado true. Só que no meu caso, estou comparando um int com um objeto Integer. Estou comparando o valor 2 com o endereço de memória que se encontra integer_n, não estou correto?

Para mim, essa comparação deveria retornar false. Por acaso, quando realizo a comparação, é realizado um autoboxing do m para Integer, ou unboxing do integer_n para int? É a única saída que vejo para que essa comparação retorne true.

6 Respostas

ViniGodoy

Sim, é feito o AutoUnboxing.

Além disso, lembre-se que os wrappers tem um cache e números no intervalo de um byte (-128 até 127) são sempre convertidos para a mesma instância.

ECO2004

Obrigado, Viny.

Há um pool para Integer (e também para Short) e um pool para String, mas não há pool para Double, nem para Float.

Por que há para inteiros e não para fracionários?

Outra dúvida: o Java faz uma conversão implícita de tipos quando não há perda de valores, como:

double n;
int m = 2;

n = m; //funciona perfeitamente
Double n = 2; //gera erro.

Para mim, a JVM faria uma conversão implícita, depois um autoboxing, mas isso não ocorre. Sabe o porquê?

ViniGodoy

O certo é:

Double n = 2.0;

Quantos números deveria haver num pool float? Lembre-se que num double que existem “infinitos” números entre 0 e 1 (0.1, 0.01, 0.001, 0.2, e assim por diante).

A

A título de curiosidade (provavelmente inútil) o limite superior do pool de inteiros pode ser definido pela linha de comando, setando a propriedade java.lang.Integer.IntegerCache.high (pelo menos para a VM da Oracle).

Isso pode gerar efeitos estranhos se você utilizar o operador == para comparar Integers.

Por exemplo, o código abaixo:

public class Main {
    
    public static void main(String[] args) {
        
        Integer inteiro1 = 200;
        Integer inteiro2 = 200;
        
        System.out.println( inteiro1 == inteiro2 );
        
    }
    
}

Rodando com java Main : false

Rodando com java -Djava.lang.Integer.IntegerCache.high=201 : true

ViniGodoy

Esse recurso que o Abel citou existe apenas em versões novas de Java (6, se não me engano).

ECO2004

Obrigado, pessoal!

Criado 14 de maio de 2012
Ultima resposta 15 de mai. de 2012
Respostas 6
Participantes 3