Diferencia entre Integer e int en Java: Guía completa
Aprende la diferencia entre Integer e int en Java: primitivo vs wrapper, null, autoboxing, memoria y cuándo usar cada uno con ejemplos de código.

int es un tipo de datos primitivo de 32 bits que almacena enteros directamente en la memoria. Integer es una clase wrapper que envuelve un int en un objeto. La diferencia clave es que Integer puede ser null y ofrece métodos como parseInt() y valueOf(), mientras que int ocupa menos memoria y es más rápido.
Diferencia entre Integer e int en Java
Contenido Rápido
intes un tipo primitivo;Integeres un objeto wrapper con métodos útiles.Integerpuede sernull;intno.- El autoboxing convierte automáticamente entre ambos tipos.
- Usa
intpara eficiencia eIntegerpara colecciones y valoresnull. Integerocupa 16 bytes en el heap;intocupa 4 bytes en el stack.
Comparación rápida: int vs Integer
| Característica | int | Integer |
|---|---|---|
| Tipo | Primitivo | Objeto wrapper |
| Valor por defecto | 0 | null |
| Memoria | 4 bytes (stack) | 16 bytes (heap) |
| Métodos disponibles | Ninguno | parseInt(), valueOf(), intValue() |
| Puede ser null | No | Sí |
| Autoboxing | Conversión automática a Integer | Conversión automática a int |
| Cuándo usarlo | Variables locales y operaciones | Colecciones, genéricos y valores null |
Tanto int como Integer de Java se utilizan para almacenar datos de tipo entero. La diferencia principal es que int es un tipo primitivo, mientras que Integer es un objeto de tipo clase. Esta distinción se vuelve significativa cuando aparece la programación orientada a objetos: int guarda el valor directamente, mientras que Integer se comporta como una clase contenedora. El primitivo int necesita 4 bytes en Java, pero el objeto Integer ocupa 16 bytes de memoria. Por lo tanto, int es comparativamente más rápido que un objeto Integer.
¿Quieres comprobarlo tú mismo? Ejecuta estos ejemplos en el Java Playground, el editor online de CodeJa que permite probar código Java en el navegador sin instalar nada.
Tipos de datos primitivos
Java tiene tipos estáticos: toda variable debe declararse con su tipo antes de usarse, indicando el tipo y el nombre. El tipo de datos determina los valores que puede contener la variable y las operaciones que se pueden realizar sobre ella. Además de int, Java admite otros siete tipos de datos primitivos. Un tipo primitivo está predefinido por el lenguaje y se nombra mediante una palabra clave reservada.
| Tipo | Tamaño | Rango |
|---|---|---|
| byte | 8 bits | -128 a 127 |
| short | 16 bits | -32.768 a 32.767 |
| int | 32 bits | -2.147.483.648 a 2.147.483.647 |
| long | 64 bits | -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 |
| float | 32 bits | Punto flotante IEEE 754 de precisión simple |
| double | 64 bits | Punto flotante IEEE 754 de doble precisión |
| boolean | No definido con precisión | true o false |
| char | 16 bits | '\u0000' a '\uffff' (0 a 65.535) |
Los valores primitivos no comparten estado entre sí. byte y short ayudan a ahorrar memoria en arreglos grandes, donde el ahorro es importante, y sus límites acotados pueden servir como documentación. long se usa cuando se necesita un rango más amplio que el de int. boolean sirve para indicadores simples de condiciones verdaderas o falsas, y char representa un único carácter Unicode de 16 bits. float y double nunca deben usarse para valores precisos, como la moneda; para eso existe la clase java.math.BigDecimal.
Si no se asigna un valor al declarar un campo, el compilador lo inicializa con un valor por defecto: los tipos numéricos con 0 (0L para long, 0.0f para float, 0.0d para double), char con '\u0000' y boolean con false. Depender de estos valores por defecto se considera un mal estilo de programación.
Clase contenedora (wrapper)
Una clase contenedora en Java se usa para convertir un tipo primitivo en un objeto y un objeto en un primitivo. Se necesitan porque las estructuras de datos como ArrayList y HashMap solo almacenan objetos, no valores primitivos. Las clases wrapper correspondientes son: byte → Byte, short → Short, int → Integer, long → Long, float → Float, double → Double, boolean → Boolean y char → Character.
Al trabajar con objetos, puedes usar métodos para obtener el valor asociado al objeto contenedor: intValue(), byteValue(), shortValue(), longValue(), floatValue(), doubleValue(), charValue() y booleanValue(). Además, Integer permite convertir su valor a otras bases con toBinaryString(), toOctalString() y toHexString(), y manipular el número con reverse() o rotateLeft().
Autoboxing y unboxing
El autoboxing es la conversión automática que realiza Java entre un tipo primitivo y su clase wrapper: convierte un int en Integer al asignarlo a una variable de tipo Integer (autoboxing), y un Integer en int en el sentido contrario (unboxing).
// Autoboxing: Java convierte int a Integer automáticamente
int numero = 42;
Integer wrapper = numero;
// Unboxing: Java convierte Integer a int automáticamente
Integer otroWrapper = 100;
int otroNumero = otroWrapper;
// Las colecciones aplican autoboxing sin conversión manual
java.util.List<Integer> numeros = new java.util.ArrayList<>();
numeros.add(7); // el int 7 se convierte a Integer solo
Convertir String a int con parseInt y valueOf
No se puede asignar una cadena que contenga un número a una variable int directamente, ni siquiera mediante conversión de tipos. Para convertirla, usa Integer.parseInt(), que devuelve un primitivo int, o Integer.valueOf(), que devuelve un objeto Integer.
// Integer.parseInt: devuelve un int primitivo
int valor = Integer.parseInt("123");
System.out.println(valor); // 123
// Integer.valueOf: devuelve un objeto Integer
Integer wrapper = Integer.valueOf("123");
System.out.println(wrapper + 1); // 124, con unboxing automático
¿Por qué Integer puede ser null y int no?
Integer es un objeto, por lo que una referencia puede valer null. int es un primitivo y nunca puede ser null: un campo int sin inicializar vale 0. Esta diferencia es la razón principal para usar Integer cuando el valor puede estar ausente, como al consultar una base de datos.
Integer wrapper = null; // válido: Integer acepta null
// int numero = null; // error de compilación: int no acepta null
int numero = 0; // valor por defecto de un campo int sin inicializar
Preguntas frecuentes
¿Cuál es la diferencia entre Integer e int en Java?
int es un tipo primitivo que almacena el valor directamente y ocupa 4 bytes. Integer es una clase wrapper que envuelve un int en un objeto de 16 bytes, puede ser null y ofrece métodos como parseInt(), valueOf() y toString().
¿Qué es int en Java?
int es un tipo de dato primitivo que almacena números enteros con signo de 32 bits, en un rango de -2.147.483.648 a 2.147.483.647. Ocupa 4 bytes de memoria y es el tipo entero más utilizado en Java.
¿Qué es Integer en Java?
Integer es la clase wrapper del tipo int, perteneciente al paquete java.lang. Representa un objeto que encapsula un valor int y ofrece métodos útiles como parseInt(), valueOf(), compareTo() y toString().
¿Qué es el autoboxing en Java?
El autoboxing es la conversión automática que realiza Java entre tipos primitivos y sus clases wrapper. Convierte un int en Integer cuando se asigna a una variable de tipo Integer, y realiza el proceso inverso, llamado unboxing, al asignar un Integer a un int.
¿Cuándo usar int y cuándo usar Integer?
Usa int cuando necesites eficiencia y no necesites representar valores nulos. Usa Integer cuando trabajes con colecciones genéricas como ArrayList<Integer>, cuando el valor pueda ser null o cuando necesites los métodos utilitarios de la clase wrapper.
¿Por qué Integer es más lento que int?
Integer es un objeto que vive en el heap, lo que añade overhead de memoria y trabajo de recolección de basura. Además, cada operación requiere autoboxing o unboxing, pasos adicionales que no existen con el primitivo int.
¿Cómo convertir un String a int en Java?
Usa Integer.parseInt("123") para obtener un int primitivo, o Integer.valueOf("123") para obtener un objeto Integer. Ambos lanzan NumberFormatException si la cadena no contiene un número válido.
¿Integer ocupa más memoria que int?
Sí. Un int ocupa 4 bytes en el stack, mientras que un objeto Integer ocupa 16 bytes en el heap entre el objeto y su valor. Por eso, en operaciones de alto rendimiento o arreglos grandes, int es la opción preferible.
Preguntas Frecuentes
¿Cuál es la diferencia entre int e Integer en Java?
int es un tipo primitivo que guarda el valor directamente en 32 bits; Integer es una clase envoltorio que envuelve un int y permite tratarlo como un objeto. Integer admite null y puede usarse en colecciones como ArrayList<Integer>, mientras que int no.
¿Cuándo debo usar Integer en lugar de int?
Usa Integer cuando necesites valores null, por ejemplo en campos opcionales, respuestas de APIs o colecciones genéricas. Usa int cuando quieras máximo rendimiento y menor consumo de memoria, como en bucles y arreglos grandes.
¿Qué es el autoboxing y el unboxing en Java?
El autoboxing convierte automáticamente un int a Integer al asignarlo, por ejemplo Integer n = 5;. El unboxing hace lo inverso, convierte un Integer a int, por ejemplo int x = n;. Java aplica ambas conversiones de forma implícita en tiempo de compilación.
¿Por qué Integer a = 100; y a == b da true pero con 200 da false?
Java cachea los Integer entre -128 y 127, por lo que ambos apuntan a la misma instancia y == compara referencias iguales. Fuera de ese rango se crean objetos distintos, así que debes comparar con equals() en lugar de ==.
¿Cómo convierto entre int e Integer y entre estos y String?
Para pasar de int a Integer usa Integer.valueOf(x) o la asignación con autoboxing; para lo contrario usa intValue() o el unboxing automático. Para convertir String a int usa Integer.parseInt() y para lo inverso Integer.toString().
Artículos Relacionados
Newsletter Semanal de Java
Cada viernes recibe lo más nuevo del ecosistema Java: frameworks, herramientas y mejores prácticas.
🔒 Sin spam. Cancela cuando quieras.