Gustavo Santos:
Galera até 127 os Wrappers não retornam true com == ???
Porque as duas primeiras comparações resultam em false ?!
public class MyClass {
public Integer startingI;
public void methodA() {
Integer i = new Integer(25);
startingI = i;
methodB(i);
}
private void methodB(Integer i2) {
i2 = i2.intValue();
System.out.println(i2 == startingI); // false. pq? o valor é 25
System.out.println(i2 == startingI); // false. pq? o valor é 25
System.out.println(i2.equals(startingI));
System.out.println(i2.equals(startingI));
}
public static void main(String[] args) {
MyClass m = new MyClass();
m.methodA();
}
}
Sei que não referênciam objetos iguals, porém não tem o esquema de funfar com == até 127 ?!
Grato
O que acontece é porque quando vc cria um Integer com um valor literal esse valor e alocado em um cache
Integer a = 10 // ocorre new Integer(10) implicitamente como o valor é menor que 128, esse objeto é alocado em uma especie de pool;
Integer b = a;
b = b.intValue(); // aqui entao e feito unboxing e em seguida boxing, a JVM verifica se tem algum objeto em cache que bata com o objeto a ser criado, como o objeto que foi alocado no cache realmente bateu com o que esta sendo feito o boxing agora, então vai ser retirado o mesmo objeto do cache e atribuido á b novamente.
Agora nesse caso e criado um objeto diretamente no heap por isso retorna false seu ==, independentemente do valor ser 127.
Integer a = new Integer(10); // objeto direto no heap.
Integer b = a; // ok referenciam o mesmo objeto no heap.
b = b.intValue(); // agora aqui esta o misterio rsrs, ou seja como nao existe nenhum objeto alocado no cache, vai ocorrer, unboxing em seguida vai ser criado um novo objeto com o boxing, chamando o new Integer(10) por nao existir nenhum objeto no cache, é o que acontece no seu exemplo, ok?.