Ejercicio 7: LinkedHashSet
Enunciado
En este ejercicio profundizamos en la variante LinkedHashSet. Aunque comparte la propiedad de no admitir duplicados con el resto de los Set, tiene una característica especial: mantiene el orden de inserción.
Objetivos:
- Declarar un conjunto usando la interfaz
Set. - Verificar el comportamiento ante duplicados y valores nulos.
- Realizar un recorrido personalizado añadiendo prefijos.
- Comparar el orden de salida frente a un
HashSetconvencional.
Solución
Implementamos la lógica para gestionar una lista de alumnos. Observa cómo al final comparamos dos conjuntos con los mismos datos para ver cómo cambia el orden en consola.
package Tema8.Ejercicios.ejercicio7;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.HashSet;
public class Ejercicio7 {
public static void main(String[] args) {
// 1. Crear el conjunto usando la interfaz Set
// LinkedHashSet respeta el orden en que añadimos los elementos
Set<String> alumnos = new LinkedHashSet<>();
// 2. Agregar nombres de alumnos
alumnos.add("Fran");
alumnos.add("Ana");
alumnos.add("Luis");
alumnos.add("Marta");
// 3. Imprimir contenido
// ¿Referencia o valor? Imprime el valor (toString() sobreescrito)
System.out.println("Lista original (orden entrada): " + alumnos);
// 4. ¿Permite duplicados?
// Los Set nunca permiten elementos repetidos
alumnos.add("Fran");
System.out.println("Tras intentar repetir a Fran: " + alumnos);
// 5. ¿Permite nulos?
// Admite un valor nulo
alumnos.add(null);
System.out.println("Tras añadir un null: " + alumnos);
// 6. Recorrido con prefijo "D."
System.out.println("\nRecorrido ordenado (LinkedHashSet):");
for (String nombre : alumnos) {
if (nombre != null) {
System.out.println("D. " + nombre);
} else {
System.out.println("D. [Nulo]");
}
}
// 7. Comparación con HashSet
Set<String> alumnosHashSet = new HashSet<>();
alumnosHashSet.add("Fran");
alumnosHashSet.add("Ana");
alumnosHashSet.add("Luis");
alumnosHashSet.add("Marta");
alumnosHashSet.add(null);
// En HashSet el orden será impredecible (basado en el hash)
System.out.println("\nComparación con HashSet (Orden aleatorio):");
System.out.println(alumnosHashSet);
}
}
Conclusiones del Ejercicio
¿Por qué usar LinkedHashSet?
A veces necesitamos la velocidad de búsqueda de un conjunto y la restricción de no duplicados, pero queremos mostrar los datos al usuario en el mismo orden en que se registraron. Aquí es donde brilla esta implementación.
HashSet vs LinkedHashSet:
Mientras que HashSet utiliza una tabla hash pura (máximo rendimiento, orden caótico), LinkedHashSet añade una lista doblemente enlazada que recorre todos los elementos, manteniendo la cronología de entrada.