1. Introducción
Ya sabemos que ArrayList es un «array infinito» que crece por sí solo. Pero tiene una limitación: el acceso a los elementos se hace por número (índice). Si tenemos una lista de mil personas y queremos encontrar el teléfono de Alicia, habrá que conocer su índice o recorrer a todos uno por uno.
En la vida real solemos buscar datos por un identificador único:
- por nombre buscamos el número de teléfono,
- por número de pasaporte buscamos al titular,
- por login encontramos la contraseña,
- por id buscamos un objeto en la base de datos.
Para eso necesitamos una estructura que sepa: «recibe una clave → encuentra el valor al instante». En Java de esto se encarga HashMap<K,V>.
Analogía:
Imagina un diccionario de papel. Buscas la traducción de la palabra «house». No necesitas hojear todas las páginas. Vas directamente a la letra «H» y encuentras la palabra que necesitas. Así funciona HashMap: por la clave (la palabra) obtenemos al instante el valor (la traducción).
Crear un diccionario
Para crear un diccionario, hay que indicar qué tipos serán las claves y cuáles serán los valores.
import java.util.HashMap;
HashMap<String, String> phonebook = new HashMap<String, String>();
Aquí:
- String (primer tipo) es el tipo de la clave (nombre de la persona).
- String (segundo tipo) es el tipo del valor (número de teléfono).
Ahora phonebook es como una agenda telefónica de verdad.
Otros ejemplos:
HashMap<String, Integer> grades = new HashMap<String, Integer>(); // nombre → nota
HashMap<Integer, String> users = new HashMap<Integer, String>(); // id → nombre
HashMap<String, Boolean> flags = new HashMap<String, Boolean>(); // clave → valor booleano
A diferencia de ArrayList, el diccionario no tiene el método add(), pero sí los suyos, no menos interesantes.
2. Método put(key, value) — añadir un par
La principal diferencia de HashMap respecto a los arrays y las listas es que no almacena solo un conjunto de valores, sino pares clave–valor. Esto lo hace similar a un diccionario real: cada palabra tiene su traducción, cada nombre — su teléfono, cada login — su contraseña.
Ejemplo:
phonebook.put("Alicia", "+380501112233");
phonebook.put("Bob", "+380671234567");
Ahora, en nuestra agenda telefónica:
- la clave "Alicia" está asociada al valor "+10501112233",
- la clave "Bob" está asociada al valor "+10671234567".
Esto significa que, para obtener el valor (el teléfono), basta con conocer la clave (el nombre).
Importante: las claves son únicas. Si intentamos añadir un nuevo valor para una clave ya existente, el valor anterior se sobrescribirá.
phonebook.put("Alicia", "+10999999999");
Ahora Alicia se ha quedado solo con el número nuevo: el número antiguo se ha perdido.
Conclusión: put es el método para añadir o actualizar entradas. Si la clave es nueva, se crea la entrada. Si la clave ya existe, se actualiza.
3. Método get(key) — obtener un valor
Para encontrar un valor, hay que conocer la clave. Esta es la gran ventaja de HashMap: la búsqueda por clave funciona muy rápido, prácticamente al instante, da igual si tenemos mil entradas o un millón.
Ejemplo:
System.out.println(phonebook.get("Alicia"));
Salida:
+10501112233
Si esa clave no existe, get devolverá null:
System.out.println(phonebook.get("Charlie")); // null
Esto significa: «no existe la clave "Charlie" en el diccionario».
4. Método containsKey(key) — comprobar existencia
Para no toparnos con null, conviene comprobar primero si la clave existe en el diccionario.
Ejemplo:
System.out.println(phonebook.containsKey("Charlie"));
Salida:
false
Así podemos saber de antemano:
- si la clave no existe — creamos una nueva entrada,
- si la clave existe — la actualizamos.
Patrón habitual:
if (phonebook.containsKey("Alicia"))
{
System.out.println("¡Alicia ya tiene número!");
}
else
{
phonebook.put("Alicia", "+10111111111");
}
5. Método remove(key) — eliminar una entrada
Eliminar es igual de sencillo: solo hace falta conocer la clave.
phonebook.remove("Bob");
System.out.println(phonebook.get("Bob"));
Salida:
null
Ahora ya no existe la entrada con la clave "Bob" en el diccionario.
6. Recorrido de todos los pares
A menudo hace falta no solo obtener datos por una clave concreta, sino también mostrar todo el diccionario. Para ello se usa el método entrySet().
for (var entry : phonebook.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
Ejemplo de salida:
Alicia -> +10501112233
De este modo, obtenemos acceso tanto a la clave (entry.getKey()) como al valor (entry.getValue()).
7. Práctica: conteo de palabras
Veamos una tarea clásica: contar cuántas veces se repiten las palabras en un texto. Este es uno de los ejemplos más claros de para qué sirve HashMap.
String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();
for (String w : text.split(" "))
{
Integer old = freq.get(w);
freq.put(w, (old == null) ? 1 : old + 1);
}
System.out.println(freq);
Salida:
{core=1, java=3}
Veamos en detalle lo que ocurre aquí:
- Dividimos la cadena "java java core java" en palabras.
- Para cada palabra miramos si ya está en el diccionario (freq.get(w)).
- Si no está (null), significa que es la primera aparición de la palabra → guardamos 1.
- Si está, significa que la palabra ya ha aparecido → incrementamos el valor en uno.
Usos reales:
- recuento del número de llamadas al API,
- estadísticas de frecuencia de palabras en un texto,
- almacenamiento de la cantidad de productos en stock.
8. Práctica: agenda telefónica
Escribamos una aplicación un poco más grande.
import java.util.HashMap;
import java.util.Scanner;
public class PhonebookApp {
public static void main(String[] args)
{
HashMap<String, String> phonebook = new HashMap<String, String>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Introduzca un nombre (o una línea vacía para salir): ");
String name = console.nextLine();
if (name.isEmpty()) break;
System.out.print("Introduzca el número: ");
String phone = console.nextLine();
phonebook.put(name, phone);
}
System.out.println("Agenda telefónica:");
for (var entry : phonebook.entrySet())
{
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
El programa funciona como un mini-directorio. Introduces nombres y teléfonos, y se guardan en HashMap. Al final puedes mostrar la lista completa. Los diccionarios se utilizan muy a menudo en proyectos reales.
GO TO FULL VERSION