[RESOLVIDO] - Comparar int com Integer

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.

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.

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ê?

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

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

Obrigado, pessoal!