Clase HashSet de Java: Guía Completa de Operaciones, Métodos y Teoría de Conjuntos
Clase HashSet de Java
Explora la clase HashSet de Java—su creación, métodos principales y operaciones prácticas de conjuntos—a través de ejemplos concisos.
La clase HashSet, parte del Framework de Colecciones de Java, implementa la interfaz Set y ofrece almacenamiento basado en tabla hash.
Creando un HashSet
Primero, importa java.util.HashSet:
import java.util.HashSet;
Luego crea un HashSet con capacidad y factor de carga específicos:
HashSet<Integer> numeros = new HashSet<>(8, 0.75); // capacidad=8, loadFactor=0.75
Parámetros:
- capacidad – cuenta inicial de buckets (8 en este ejemplo).
- factorDeCarga – umbral que dispara redimensionado (0.75 significa redimensionar cuando está al 75% lleno).
Usar valores por defecto también es común:
HashSet<Integer> numeros1 = new HashSet<>(); // capacidad=16, factorDeCarga=0.75
Métodos de HashSet
A continuación, los métodos más usados:
add(T elemento)– inserta un solo elemento.addAll(Collection<? extends T> c)– inserción en lote.remove(Object o)– elimina un elemento específico.removeAll(Collection<? extends Object> c)– elimina múltiples elementos.contains(Object o)– verifica presencia.size()– número de elementos.clear()– elimina todas las entradas.clone()– crea una copia superficial.isEmpty()– prueba si está vacío.containsAll(Collection<? extends Object> c)– verifica subconjunto.
Insertando Elementos
Ejemplo usando add y addAll:
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numerosPares = new HashSet<>();
numerosPares.add(2);
numerosPares.add(4);
numerosPares.add(6);
System.out.println("HashSet: " + numerosPares);
HashSet<Integer> numeros = new HashSet<>();
numeros.addAll(numerosPares);
numeros.add(5);
System.out.println("Nuevo HashSet: " + numeros);
}
}
Salida
HashSet: [2, 4, 6] Nuevo HashSet: [2, 4, 5, 6]
Accediendo a Elementos
Itera con Iterator:
import java.util.HashSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
HashSet<Integer> numeros = new HashSet<>();
numeros.add(2);
numeros.add(5);
numeros.add(6);
System.out.println("HashSet: " + numeros);
Iterator<Integer> iterar = numeros.iterator();
System.out.print("HashSet usando Iterator: ");
while(iterar.hasNext()) {
System.out.print(iterar.next() + ", ");
}
}
}
Salida
HashSet: [2, 5, 6] HashSet usando Iterator: 2, 5, 6,
Eliminando Elementos
Eliminación individual y limpieza del set:
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numeros = new HashSet<>();
numeros.add(2);
numeros.add(5);
numeros.add(6);
System.out.println("HashSet: " + numeros);
boolean eliminado = numeros.remove(5);
System.out.println("¿Se eliminó 5? " + eliminado);
boolean limpiado = numeros.removeAll(numeros);
System.out.println("¿Se eliminaron todos los elementos? " + limpiado);
}
}
Salida
HashSet: [2, 5, 6] ¿Se eliminó 5? true ¿Se eliminaron todos los elementos? true
Operaciones de Conjunto
Los métodos en lote de HashSet soportan operaciones clásicas de teoría de conjuntos.
Unión
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numerosPares = new HashSet<>();
numerosPares.add(2);
numerosPares.add(4);
HashSet<Integer> numeros = new HashSet<>();
numeros.add(1);
numeros.add(3);
numeros.addAll(numerosPares);
System.out.println("Unión es: " + numeros);
}
}
Salida
Unión es: [1, 2, 3, 4]
Intersección
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numerosPrimos = new HashSet<>();
numerosPrimos.add(2);
numerosPrimos.add(3);
HashSet<Integer> numerosPares = new HashSet<>();
numerosPares.add(2);
numerosPares.add(4);
numerosPares.retainAll(numerosPrimos);
System.out.println("Intersección es: " + numerosPares);
}
}
Salida
Intersección es: [2]
Diferencia
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numerosPrimos = new HashSet<>();
numerosPrimos.add(2);
numerosPrimos.add(3);
numerosPrimos.add(5);
HashSet<Integer> numerosImpares = new HashSet<>();
numerosImpares.add(1);
numerosImpares.add(3);
numerosImpares.add(5);
numerosPrimos.removeAll(numerosImpares);
System.out.println("Diferencia: " + numerosPrimos);
}
}
Salida
Diferencia: [2]
Verificación de Subconjunto
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numeros = new HashSet<>();
numeros.add(1);
numeros.add(2);
numeros.add(3);
numeros.add(4);
HashSet<Integer> numerosPrimos = new HashSet<>();
numerosPrimos.add(2);
numerosPrimos.add(3);
boolean esSubconjunto = numeros.containsAll(numerosPrimos);
System.out.println("¿Es numerosPrimos un subconjunto de numeros? " + esSubconjunto);
}
}
Salida
¿Es numerosPrimos un subconjunto de numeros? true
Métodos Adicionales
| Método | Descripción |
|---|---|
clone() | Crea una copia superficial del set. |
contains() | Verifica si existe un elemento. |
isEmpty() | Devuelve true si el set está vacío. |
size() | Número de elementos en el set. |
clear() | Elimina todos los elementos. |
Para lista completa, consulta la documentación oficial de Java.
Por Qué Usar HashSet
Cuando se requiere acceso aleatorio, HashSet ofrece rendimiento O(1) gracias a su tabla hash. El hashCode() de cada elemento garantiza unicidad, previniendo duplicados. Sin embargo, HashSet no es thread-safe; se necesita sincronización externa para uso concurrente.
Nota: Como HashSet no está sincronizado, múltiples hilos modificándolo concurrentemente pueden corromper la estructura de datos.
Java
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
- Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
- Dominando los Algoritmos de Colecciones de Java: Ordenación, Mezcla y Más
- Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
- Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación