Bom dia, Calebe. Tudo bem? Espero que sim!
A principal diferença, como você mesmo mencionou, entre Integer
e int
está no fato de que Integer
é um objeto, e int
é o valor primitivo dele.
Também chamamos essa classe Integer
como Wrapper Class, que nada mais é do que uma classe que encapsula uma propriedade de valor primitivo int
, com métodos utilitários disponíveis ao código-cliente. O mesmo se aplica às classes Character
(sendo este o Wrapper Class de um char), Double
, Long
, Float
etc.
Simplificando: a principal diferença entre uma variável Integer
ou int
, é que no Integer
, nós temos métodos complementares ao nosso dispôr, por exemplo:
Integer variavel = 1;
variavel.longValue(); // transforma em long
Ou seja, a ideia de utilizar uma Wrapper Class tem a principal vantagem de simplificar o código-cliente. A leitura de uma variável Integer
invocando o método longValue()
pode acabar soando bem mais intuitivo durante a leitura do código. Obviamente, existem outros métodos utilitários bem mais interessantes do que apenas uma converção para o tipo long
, como por exemplo o Integer.toHexString()
, que abstrai uma boa quantidade de código para retorno de um inteiro para sua versão Hexadecimal.
E finalmente, sobre a questão de performance: sim, tem diferença.
Um objeto no Java ocupa, no mínimo, 16 bytes de armazenamento. Já o int primitivo ocupa apenas 4 bytes (32 bits). Isso resulta em uma diferença de 300% entre os dois tipos. Mas cara, sendo bem sincero, no dia-a-dia, raramente você vai se importar com quantos bytes de memória um objeto está comendo da JVM, a não ser que o objetivo do seu software seja ser o mais performático o possível, que geralmente nunca é a prioridade.
Se tiver mais interesse em saber sobre uso de memória de objetos, recomendo essa thread do Stackoverflow. Bem interessante.