💾 Tipos de datos
Un tipo de datos es un conjunto de valores y un conjunto de operaciones definidas en ellos. Se pueden clasificar en primitivos y objetos.

🧩 Tipos primitivos
Los primitivos son los más básicos y fundamentales, vienen integrados en Java.
Especifican el tipo de valor almacenado en una variable y el tamaño en memoria.
👉 Existen 8 tipos primitivos en Java: byte, short, int, long, float, double, boolean y char.
🔸 byte
Como su propio nombre denota, emplea un solo byte (8 bits) de almacenamiento.
- Tamaño: 8 bits
- Rango: [-128, 127]
- Se usa raramente, ocupa muy poca memoria.
byte b = 2;
🔸 short
- Tamaño: 16 bits
- Rango: [-32.768, 32.767]
short s = 3467;
🔸 int
- Tamaño: 32 bits
- Rango: [-2.147.483.648, 2.147.483.647]
- ✅ Es el entero predeterminado en Java.
int maxValor = 2147483647;
// Desde Java 7 puedes usar guiones bajos
int maxValue = 2_147_483_647;
🔸 long
Es el tipo entero de mayor tamaño.
- Tamaño: 64 bits
- Rango: [-9.223.372.036.854.775.808, 9.223.372.036.854.775.807]
- Se indica con una L al final.
long myLongNumber = 500L;
🔸 float
Tiene una parte flotante que sirve para expresar números decimales. No se recomienda mucho su uso.
- Tamaño: 32 bits
- Rango: ±1.4E-45 a ±3.4028235E38
- Decimales de precisión simple.
- Se indica con una f al final.
float f = 4;
float f = 4f;
🔸 double
Se recomienda su uso. Muchas librerías internas de Java, relacionadas con operaciones matemáticas, usan double.
- Tamaño: 64 bits
- Rango: ±4.9E-324 a ±1.7976931348623157E308
- ✅ Es el decimal predeterminado en Java.
double d = 5.0;
double d = 5d;
🔸 char
Se utiliza para almacenar caracteres (letras, números, signos, etc.) individuales.
- Tamaño: 16 bits
- Permite almacenar caracteres Unicode (hasta 65.535).
- Útil para representar letras, símbolos y emojis.
Unicode es un estándar de codificación internacional que nos permite representar diferentes idiomas; y la forma en que funciona es usando una combinación de los dos bytes que un char ocupa en la memoria, que puede representar hasta 65535 diferentes tipos de caracteres. Unicode table.
char c = 'P';
char u = '\u00A2';//print unicode character
⚡ Un carácter precedido por una barra invertida () es una secuencia de escape y tiene un significado especial para el compilador. La siguiente tabla muestra las secuencias de escape de Java:

🔸 boolean
- Representa solo dos valores posibles: true o false.
- Tamaño no definido exactamente en Java (depende de la JVM).
- Tiene la finalidad de facilitar el trabajo con valores "verdadero/falso" (booleanos), resultantes por regla general de evaluar expresiones.
boolean isMyNamePatri = true;
Tipos de datos primitivos en Java
| Tipo | Tamaño en bits | Valor mínimo | Valor máximo | Ejemplo |
|---|---|---|---|---|
| byte | 8 | -128 | 127 | byte b = 100; |
| short | 16 | -32,768 | 32,767 | short s = 1000; |
| int | 32 | -2,147,483,648 | 2,147,483,647 | int i = 100000; |
| long | 64 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | long l = 100000L; |
| float | 32 | ≈ ±1.4E-45 | ≈ ±3.4028235E38 | float f = 3.14f; |
| double | 64 | ≈ ±4.9E-324 | ≈ ±1.7976931348623157E308 | double d = 3.14; |
| char | 16 | 0 ( '\u0000' ) | 65,535 ( '\uffff' ) | char c = 'A'; |
| boolean | 1 bit* | true / false |
— | boolean b = true; |
* El tamaño de boolean no está especificado exactamente en Java; internamente depende de la JVM, pero conceptualmente ocupa 1 bit.
📦 Wrapper classes en Java (clases contenedores)
Las clases contenedoras o Wrapper classes proporcionan una forma de utilizar tipos de datos primitivos como objetos.
Son muy útiles para operaciones avanzadas y colecciones (ej. ArrayList).
En Java, tenemos una Wrapper class para cada uno de los 8 tipos de datos primitivos. Gracias a esto, podemos realizar operaciones en un dato primitivo.
| Tipo primitivo | Wrapper class | Métodos útiles |
|---|---|---|
| byte | Byte | Byte.parseByte("1"), Byte.MIN_VALUE (-128), Byte.MAX_VALUE (127) |
| short | Short | Short.parseShort("12"), Short.MIN_VALUE (-32,768), Short.MAX_VALUE (32,767) |
| int | Integer | Integer.parseInt("123"), Integer.MIN_VALUE (-2,147,483,648), Integer.MAX_VALUE (2,147,483,647) |
| long | Long | Long.parseLong("9999"), Long.MIN_VALUE (-9,223,372,036,854,775,808), Long.MAX_VALUE (9,223,372,036,854,775,807) |
| float | Float | Float.parseFloat("3.14"), Float.MIN_VALUE (≈1.4E-45), Float.MAX_VALUE (≈3.4028235E38) |
| double | Double | Double.parseDouble("2.71"), Double.MIN_VALUE (≈4.9E-324), Double.MAX_VALUE (≈1.7976931348623157E308) |
| boolean | Boolean | Boolean.parseBoolean("true"), Boolean.TRUE, Boolean.FALSE |
| char | Character | Character.isLetter('a'), Character.MIN_VALUE ('\u0000'), Character.MAX_VALUE ('\uffff') |
int minimoValorInt = Integer.MIN_VALUE;
int i = Integer.parseInt("123"); // 123 (int)
📐 Cuándo usar float vs double
| Tipo | Precisión | Memoria | Uso recomendado |
|---|---|---|---|
| float | ~7 cifras decimales | 32 bits | - Arrays grandes de números decimales (ahorro memoria) - Gráficos 2D/3D, librerías que lo requieran (OpenGL, motores de juego) - Dispositivos con memoria limitada |
| double | ~15 cifras decimales | 64 bits | - Cálculos matemáticos y científicos - Finanzas y datos sensibles a la precisión - Es el tipo decimal predeterminado en Java |