Ejercicio 5: Conjuntos (Set) y Modificador Final
Enunciado
En esta práctica exploraremos el comportamiento de los conjuntos en Java mediante la interfaz Set y su implementación HashSet. También analizaremos una de las dudas más comunes: ¿qué significa realmente que una colección sea final?
Tareas:
- Crear un conjunto de enteros y comprobar si admite duplicados o valores nulos.
- Trabajar con subconjuntos mediante el método
containsAll(). - Crear una lista
finala partir del conjunto y experimentar con su mutabilidad.
Solución
A continuación se muestra la implementación del ejercicio, donde probamos las restricciones de los conjuntos y el uso de métodos de comparación entre colecciones.
package Tema8.Ejercicios.ejercicio5;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Ejercicio5 {
public static void main(String[] args) {
// 1. Crear conjunto y añadir los 5 primeros números naturales
Set<Integer> numeros = new HashSet<>();
numeros.add(1);
numeros.add(2);
numeros.add(3);
numeros.add(4);
numeros.add(5);
// Al imprimir, vemos los valores (HashSet tiene toString implementado)
System.out.println("Conjunto inicial: " + numeros);
// 2. ¿Permite duplicados?
numeros.add(3); // Intentamos añadir el 3 otra vez
System.out.println("Tras intentar añadir el 3 repetido: " + numeros);
// 3. ¿Permite nulos?
numeros.add(null);
System.out.println("Tras añadir null: " + numeros);
// 4. Comprobar subconjuntos
Set<Integer> numerosPrimos = new HashSet<>();
numerosPrimos.add(2);
numerosPrimos.add(3);
// containsAll() verifica si el conjunto contiene todos los elementos del otro
boolean esSubconjunto = numeros.containsAll(numerosPrimos);
System.out.println("¿Es {2,3} un subconjunto?: " + esSubconjunto);
// 5. Lista con modificador final
numeros.remove(null); // Limpiamos el null para evitar problemas en la lista
final List<Integer> listaFinal = new ArrayList<>(numeros);
// ¿Podemos modificarla?
listaFinal.add(100);
System.out.println("Lista final tras añadir un elemento: " + listaFinal);
}
}
Preguntas de reflexión
1. ¿Imprime la referencia o el valor?
Imprime el valor porque las colecciones en Java sobrescriben el método toString() para mostrar su contenido de forma legible.
2. ¿Permite duplicados o nulos?
Un HashSet no permite duplicados (ignora el elemento si ya existe). Sí permite un único valor null.
3. ¿Es la lista inmutable por ser "final"?
No. El modificador final en una variable de referencia significa que no puedes reasignar la variable a una nueva lista (listaFinal = new ArrayList() daría error). Sin embargo, el contenido del objeto sigue siendo mutable: puedes añadir, eliminar o modificar sus elementos sin problemas.