Sobes.tech
Middle

O que acontece ao comparar Integer a = 127 e int b = 127, bem como Integer a1 = 128 e int b1 = 128 em Java? Explique por que os resultados da comparação serão diferentes.

sobes.tech IA

Resposta da IA

Ao comparar Integer a = 127 e int b = 127 usando o operador ==, o resultado será true. Isso ocorre devido ao autoboxing (autoboxing) de int b em um objeto Integer, e também porque o valor 127 está na faixa de objetos Integer em cache (por padrão de -128 a 127). O Java usa um pool de objetos para esses valores, portanto a e o b empacotado apontam para o mesmo objeto.

Ao comparar Integer a1 = 128 e int b1 = 128, o resultado do operador == será false. Embora b1 também seja automaticamente empacotado em um objeto Integer, o valor 128 está fora da faixa de valores em cache. Portanto, ao fazer autoboxing, um novo objeto Integer é criado para b1. As referências a1 e o b1 empacotado apontam para objetos diferentes no heap, mesmo que seus valores numéricos sejam iguais.

Para comparar os valores de objetos envolventes (como Integer), deve-se usar o método equals().

// Comparação de valores
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (autoboxing de int e cache de Integer)
System.out.println(a.equals(b)); // true (comparação de valores)

Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (autoboxing de int, mas sem cache para esse valor)
System.out.println(a1.equals(b1)); // true (comparação de valores)

Integer a2 = new Integer(127); // Criação de um novo objeto, mesmo que o valor esteja em cache
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (objetos diferentes no heap)
System.out.println(a2.equals(a3)); // true (comparação de valores)

Portanto, == compara referências de objetos para tipos envolventes, enquanto para comparar tipos primitivos ou valores de objetos envolventes, deve-se usar equals(). A característica de cache de Integer para o intervalo [-128, 127] influencia o resultado de == ao trabalhar com números nesse intervalo.