HOWTO · Java
Diferencia entre los tipos de datos `long` e `int` en Java
Este artículo explica la diferencia entre los tipos de datos long e int en Java
En esta página
Usa int cuando los valores que espera tu programa estén dentro de su rango; elige long si pueden ser mayores. Ambos son tipos primitivos de enteros con signo. Sus clases envoltorio, Integer y Long, son objetos que se usan con API y colecciones que trabajan con tipos de referencia. A continuación se comparan sus rangos, la sintaxis de los literales y cuándo conviene usar un wrapper.
Cómo elegir entre int y long en Java
Un int tiene 32 bits y representa valores desde -2,147,483,648 hasta 2,147,483,647. Un long tiene 64 bits y representa valores desde -9,223,372,036,854,775,808 hasta 9,223,372,036,854,775,807. Decide según el rango esperado de tus datos: el nombre del tipo no garantiza que quepa en él el resultado de cualquier operación aritmética.
| Tipo | Ancho | Mínimo | Máximo |
|---|---|---|---|
int |
32 bits | -2,147,483,648 | 2,147,483,647 |
long |
64 bits | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
Un literal entero decimal sin sufijo normalmente se interpreta como int si cabe en ese tipo. Añade L para indicar que un literal es long, sobre todo si su valor supera el rango de int. Es preferible usar la L mayúscula, porque se distingue mejor del dígito 1. Por ejemplo, long population = 9_000_000_000L; utiliza un literal long válido. Los guiones bajos facilitan la lectura y no cambian el valor.
Ejecuta este ejemplo para comparar un valor int con uno long. Las etiquetas visibles del bloque de código se conservan en inglés.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
public class IntVsLongExample {
public static void main(String[] args) {
int count = 120;
long total = 9_000_000_000L;
System.out.println("count: " + count);
System.out.println("total: " + total);
}
}
count: 120
total: 9000000000
Para comparar un error de compilación, int tooLarge = 2147483648; no compila: ese literal decimal no cabe en int y no está marcado como long. En su lugar, escribe long value = 2147483648L;. El compilador rechaza la primera declaración antes de que se ejecute el programa, así que no produce salida en tiempo de ejecución. Recuerda también que una expresión int se evalúa como int, salvo que un operando o una conversión haga que la operación aritmética sea long. Asignar a un long un resultado que ya se desbordó no recupera el valor perdido.
Cómo usar las clases envoltorio Integer y Long
Integer envuelve un int, y Long envuelve un long. Java puede convertir entre un primitivo y su wrapper mediante boxing y unboxing automáticos. Por ejemplo, Integer score = 42; convierte el valor primitivo en un objeto, mientras que int recordedScore = score; extrae el valor primitivo del objeto. También están disponibles los métodos explícitos intValue() y longValue(); pueden hacer la conversión más clara cuando conviene mostrarla en el código.
Los wrappers son útiles cuando una API requiere objetos. Por ejemplo, las colecciones genéricas como List<Integer> no admiten tipos primitivos como argumento de tipo, así que los valores que se añaden a esa lista se convierten en objetos. Elige Long para representar como objeto un valor long, por ejemplo en List<Long>. Para la aritmética local habitual, los tipos primitivos suelen ser más sencillos; no hace falta usar wrappers solo para llamar a un método de conversión o utilidad.
El rango del valor envuelto no cambia: un Integer contiene un valor int y un Long contiene un valor long. Un wrapper no permite representar un número mayor que el que admite el tipo primitivo subyacente. Usa L en un literal long tanto si lo asignas a una variable long como si lo conviertes automáticamente en un Long.
Diferencias entre los tipos primitivos y los objetos wrapper
Una variable primitiva almacena un valor de su tipo primitivo. Una variable wrapper contiene una referencia a un objeto wrapper o null. Esta es la distinción útil al programar; describir los wrappers simplemente como punteros a un espacio de almacenamiento numérico es un modelo físico impreciso y no ayuda a elegir el tipo.
Los tipos primitivos no pueden ser null. Una referencia como Integer optionalCount = null; puede representar la ausencia de un valor, algo útil cuando una API o un modelo de datos distingue entre «no proporcionado» y el número cero. Para usar ese valor, primero hay que comprobar que no sea null. Si Java intenta extraer el valor de un Integer o Long que es null, la operación produce una excepción NullPointerException; haz unboxing solo cuando sepas que la referencia apunta a un objeto.
En resumen, elige int o long según el rango numérico que necesites y usa Integer o Long cuando una API basada en objetos, una colección o la posibilidad de representar valores nulos requiera un wrapper. Así, tanto la aritmética como la representación de datos ausentes quedan explícitas.