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