Lo esencial
Un Set (conjunto) es una estructura de datos que no admite elementos duplicados. Si intentas guardar en un conjunto un dato que ya existe, Java simplemente lo ignora y tu programa sigue funcionando. Además, a diferencia de las listas o los arrays, en un conjunto normal no nos importa el orden en el que se guardan las cosas. Es la herramienta perfecta para registrar cosas únicas (DNI, IP, direcciones de correo…) o cuando solo te interesa saber qué elementos tienes, pero no cuántos hay de cada tipo ni en qué posición están. Un conjunto te dice rapidísimamente si un elemento «está o no está».
En Java, la forma más común y rápida de crear un conjunto es utilizando la clase HashSet.
Introducción
Hasta ahora, cuando necesitábamos guardar varios datos, usábamos Arrays o ArrayLists. En una lista, puedes guardar el mismo dato cinco veces y el programa lo guardará en cinco posiciones diferentes (la posición 0, la 1, la 2…). Además, el orden de inserción se respeta estrictamente.
Pero, ¿qué pasa si queremos guardar los DNI de los alumnos que han venido hoy a clase? Si un alumno pasa su tarjeta dos veces por el lector, no queremos que cuente como dos personas distintas. Queremos una colección que, de forma automática, rechace los datos repetidos. Para eso nacen los Conjuntos (Set).
1. ¿Qué es un Set y qué es un HashSet?
En Java, Set es un concepto (una interfaz en términos de Programación Orientada a Objetos). Es decir, es un contrato que indica: «Aquí no entran duplicados».
Como Set es solo es el contrato, necesitamos una herramienta real que lo aplique. Esa herramienta es HashSet.
La palabra «Hash» hace referencia a la técnica matemática que utiliza por debajo para guardar los datos. Gracias a esta técnica, el HashSet es increíblemente rápido buscando información. Si tienes una lista con un millón de correos electrónicos y quieres saber si «pepe@gmail.com» está en ella, una lista tradicional miraría uno por uno. Un HashSet lo sabe de forma casi instantánea.
Las dos reglas de oro de un HashSet:
- No hay duplicados: Si intentas meter un dato que ya existe, Java simplemente lo ignora. No da error, pero no lo añade.
- No hay orden garantizado: Si metes «A», «B» y «C», al imprimirlos por pantalla podrían salir como «B», «A», «C». No puedes pedirle a un
HashSetque te dé «el elemento de la posición 0», porque no tienen posiciones fijas. - Es extremadamente rápido: Gracias a un mecanismo matemático interno llamado «Hash» (del que toma su nombre), buscar si un elemento existe dentro de un conjunto de un millón de datos es casi instantáneo.
2. ArrayList vs HashSet
Para entenderlo sin código, pensemos en analogías cotidianas:
- Un ArrayList es como la cola para entrar al cine: Importa quién llegó primero (hay posiciones) y puede haber dos personas que se llamen exactamente igual en la cola.
- Un HashSet es como la lista de invitados VIP de una discoteca: No importa el orden en el que el relaciones públicas fue apuntando los nombres en la libreta. Lo único que importa es si estás en la lista o no. Y, por supuesto, no tiene sentido apuntar a «Juan Pérez» tres veces. Estás o no estás.
El mayor error al empezar a usar HashSet es intentar tratarlo como si fuera un ArrayList. Fíjate en esta tabla para no caer en la trampa:
| Característica | ArrayList (Lista) | HashSet (Conjunto) |
| Duplicados | Sí los permite. | NO los permite. |
| Orden | Se mantiene el orden de inserción. | NO hay orden garantizado. |
| Acceso | Por índice: lista.get(0) | NO se puede usar .get(). No hay posiciones. |
| Búsqueda | Lenta (revisa uno a uno). | Rapidísima (está optimizado para buscar). |
3. Cómo se usa en Java (Ejemplo práctico)
La sintaxis es muy similar a la de un ArrayList. Necesitamos importar java.util.HashSet y java.util.Set.
Java
import java.util.HashSet;
import java.util.Set;
public class EjemploHashSet {
public static void main(String[] args) {
// 1. Crear el HashSet para guardar textos (Strings)
Set<String> correosUnicos = new HashSet<>();
// 2. Añadir elementos
correosUnicos.add("ana@email.com");
correosUnicos.add("luis@email.com");
correosUnicos.add("carlos@email.com");
// 3. Intentar añadir un duplicado
// Java no dará error, pero esta instrucción será ignorada
correosUnicos.add("ana@email.com");
// 4. Ver cuántos elementos hay
System.out.println("Total de correos: " + correosUnicos.size());
// El resultado será 3, no 4.
// 5. Comprobar si un elemento existe (Esta es su gran ventaja)
if (correosUnicos.contains("luis@email.com")) {
System.out.println("Luis está en el sistema.");
}
// 6. Recorrer el HashSet
// OJO: No se puede usar un bucle 'for' normal porque no hay posiciones (índices).
// Hay que usar un bucle 'for-each'.
System.out.println("Lista de correos guardados:");
for (String correo : correosUnicos) {
System.out.println(correo);
}
}
}
3. ¿Para qué se usa en la programación real? (Casos de uso)
Solemos abusar del ArrayList para todo. Sin embargo, un programador profesional elige HashSet en situaciones muy concretas donde el rendimiento y la exclusividad de los datos son vitales. Aquí tienes tres ejemplos reales:
3.1. Eliminar duplicados de una base de datos o archivo
Imagina que te descargas un archivo Excel del banco con miles de transacciones y quieres extraer una lista de las tiendas en las que has comprado este año. Si has ido al «Mercadona» 50 veces, en una lista normal aparecerá 50 veces.
Solución: Lees el archivo y vas metiendo los nombres de las tiendas en un HashSet. Automáticamente, los 49 «Mercadonas» repetidos serán descartados sin que tengas que programar ningún if para comprobarlo.
3.2. Sistemas de moderación y filtros antispam (Palabras prohibidas)
En el chat de un videojuego multijugador o en los comentarios de un blog, hay un filtro que cambia los insultos por asteriscos. El programa tiene un diccionario con miles de palabras prohibidas.
Cada vez que un usuario escribe una palabra, el servidor tiene que comprobar si esa palabra está en la lista de prohibidas. Hacer esto con un ArrayList ralentizaría el servidor. Con un HashSet (usando el método .contains()), la comprobación es instantánea, sin importar si el diccionario tiene mil o un millón de palabras.
3.3. Control de visitas únicas o votaciones
Si diseñas una web para votar en un concurso, no quieres que una persona vote 100 veces dándole a actualizar (F5).
Cada vez que alguien entra, capturas su dirección IP o su identificador de usuario y lo intentas meter en un HashSet llamado usuariosQueYaHanVotado. Si el HashSet te dice que el usuario ya estaba dentro, le bloqueas el voto.
Reflexión crítica: La próxima vez que vayas a usar un
ArrayList, hazte esta pregunta: «¿Me importa el orden en el que se guardan los datos? ¿Podría haber elementos repetidos?». Si la respuesta a ambas es NO, probablemente deberías estar usando unHashSet.
4. Resumen de métodos indispensables
Grábate estos cuatro métodos, son el 90% de lo que necesitas saber sobre Conjuntos para aprobar y para trabajar:
.add(elemento): Intenta añadir el elemento. Devuelve true si lo añade, y false si ya existía y lo ignora..remove(elemento): Busca el elemento y lo elimina..contains(elemento): Te dice si el elemento está dentro (true) o no (false). Es extremadamente rápido..size(): Te devuelve la cantidad de elementos únicos que hay guardados.
5. Conclusión
En definitiva, HashSet es una herramienta esencial cuando necesitas almacenar datos únicos y realizar búsquedas ultrarrápidas. Su capacidad para evitar duplicados y su eficiencia lo convierten en una estructura clave en proyectos reales, desde filtros antispam hasta sistemas de control de accesos. Dominarlo te permitirá escribir código más limpio, seguro y optimizado.


Deja una respuesta