¿Qué es java.util.Set y cómo se usa en el manejo de conjuntos en Java?

| Última modificación: 27 de diciembre de 2024 | Tiempo de Lectura: 3 minutos

Para esa época de votaciones, me tocó desarrollar una aplicación en Java que consistía en un sistema de votaciones donde una persona no debería poder votar dos veces. Lo que se me ocurrió fue usar java.util.Set para trabajar fácilmente con conjuntos de datos en Java. De hecho me ayudó bastante a mantener colecciones únicas de datos. Te quiero presentar esta fantástica herramienta para que aprendas a usarla con conjuntos en Java.

java.util.Set en Java qué es

¿Qué es java.util.Set?

Java.util.Set es una interfaz que representa una colección de elementos únicos, es decir, no permite duplicados. Resulta que se basa en el concepto matemático de los conjuntos, donde cada elemento aparece una sola vez.

Es algo así como tener una colección de monedas en una vitrina. Por supuesto, no tendría sentido que tuvieses monedas repetidas, además la vitrina (java.util.Set) no lo permitiría.

Características

  • Sin duplicados: Garantiza que no se almacenen elementos repetidos.
  • Orden: No mantiene un orden específico (excepto en LinkedHashSet y TreeSet).
  • Nulos: Permite un único elemento null en la mayoría de sus implementaciones.
  • Implementaciones comunes: HashSet, LinkedHashSet y TreeSet.

Declaración básica

Como Set es una interfaz, no puedes instanciarla directamente. Entonces usa una clase que la implemente, como HashSet.

import java.util.*;

public class EjemploSet {
public static void main(String[] args) {
Set<String> conjunto = new HashSet<>();
conjunto.add("Java");
conjunto.add("Python");
conjunto.add("Java"); // Ignorado porque ya existe
System.out.println(conjunto);
}
}

Salida:

[Python, Java]

Operaciones comunes con java.util.Set

Añadir elementos

Para añadir elementos, usa el método add(). Recuerda que, si el elemento ya existe, no se añadirá.

Set<Integer> numeros = new HashSet<>();
numeros.add(10);
numeros.add(20);
numeros.add(10); // No se añade de nuevo
System.out.println(numeros);

Esta es la salida:

[10, 20]

Comprobar si un elemento existe

Con el método contains(), puedes verificar si un elemento está en el conjunto.

boolean contiene10 = numeros.contains(10);
System.out.println("¿El conjunto contiene 10? " + contiene10);

Esta es la salida:

¿El conjunto contiene 10? true

Eliminar elementos

Ten en cuenta que puedes usar el método remove() para eliminar un elemento específico.

numeros.remove(20);
System.out.println("Conjunto tras eliminar: " + numeros);

La salida es así:

Conjunto tras eliminar: [10]

Operaciones con conjuntos

Algo que me parece fantástico es que, java.util.Set te deja realizar operaciones como unión, intersección y diferencia entre conjuntos.

Unión

Mira cómo combinar todos los elementos de dos conjuntos.

Set<String> conjunto1 = new HashSet<>();
conjunto1.add("A");
conjunto1.add("B");

Set<String> conjunto2 = new HashSet<>();
conjunto2.add("B");
conjunto2.add("C");

Set<String> union = new HashSet<>(conjunto1);
union.addAll(conjunto2);
System.out.println("Unión: " + union);

La salida:

Unión: [A, B, C]

Intersección

De esta forma puedes retener solo los elementos comunes entre dos conjuntos.

Set<String> interseccion = new HashSet<>(conjunto1);
interseccion.retainAll(conjunto2);
System.out.println("Intersección: " + interseccion);

La salida queda así:

Intersección: [B]

Diferencia

De esta forma puedes eliminar los elementos del primer conjunto que también están en el segundo.

Set<String> diferencia = new HashSet<>(conjunto1);
diferencia.removeAll(conjunto2);
System.out.println("Diferencia: " + diferencia);

Observa la salida:

Diferencia: [A]

Implementaciones comunes de java.util.Set

HashSet

Por si no lo sabías, es la implementación más popular y la que mejor funciona. Aunque no garantiza un orden específico de los elementos.

Set<Integer> hashSet = new HashSet<>();
hashSet.add(1);
hashSet.add(2);
hashSet.add(1);
System.out.println("HashSet: " + hashSet);

Esta es la salida:

HashSet: [1, 2]

LinkedHashSet

Mantiene el orden de inserción de los elementos. Te servirá para preservar ese orden.

Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Perro");
linkedHashSet.add("Gato");
linkedHashSet.add("Perro");
System.out.println("LinkedHashSet: " + linkedHashSet);

Mira la salida:

LinkedHashSet: [Perro, Gato]

TreeSet

Con este puedes ordenar automáticamente los elementos según su orden natural o un comparador personalizado.

Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
System.out.println("TreeSet: " + treeSet);

La salida:

TreeSet: [1, 2, 3]

¿Cuándo puedes usar java.util.Set?

Yo te aconsejo usar java.util.Set cuando necesites garantizar que los datos sean únicos. Por ejemplo:

  • En una lista de nombres de usuario en un sistema.
  • En un conjunto de permisos sin duplicados.
  • Los números únicos generados en una lotería.

Ahora sabes que java.util.Set te será muy útil para trabajar con colecciones únicas en Java. Aprovecha sus implementaciones según tus necesidades de rendimiento, orden o clasificación. Créeme, dominar java.util.Set te permitirá escribir un mejor y más organizado código.

Únete al Bootcamp de Java Full Stack de KeepCoding y aprende desde los fundamentos hasta el desarrollo avanzado. Te prepararemos para convertirte en un experto en programación en tiempo récord y dar el salto al sector IT con confianza. ¡Tu futuro empieza aquí!

Posts más leídos