Listas en Java: tipo Set

En el post de Colecciones, mencionaba dos tipos de listas con las que podemos trabajar en Java: List y Set. En un post anterior me centraba en las listas de tipo List y ahora lo haré en las tipo Set, que a diferencia de las anteriores, no admiten duplicados.

La clase HashSet

Las listas tipo Set, las manejaremos con la clase HashSet. Esta clase funciona de manera muy parecida a la clase ArrayList, tienen muchos métodos iguales. Por ello, en la actividad siguiente para practicar con esta clase, me centraré en las diferencias de la clase HashSet con la clase ArrayList, vista previamente.

Actividad: Practicando con las listas tipo Set

  1. Continuamos trabajando en el proyecto que abrimos cuando trabajamos con las listas tipo List.
  2. En aquel proyecto empleabamos las clases Estudiante y PracticandoConListas. En esta última clase vamos a emplear la clase HashSet en lugar de la ArrayList. El código quedaría:

Puede observarse que para la clase HashSet empleamos el mismo código que usábamos con la clase ArrayList. Recordemos que las listas tipo Set no admiten duplicados, por lo que no debería admitir la última inserción, ya que se trata de un estudiante repetido. Sin embargo, si ejecutamos el programa, obtenemos:

Vemos que estamos añadiendo todos los estudiantes a la lista. Esto es así, porque cada objeto que creamos tiene un identificador interno propio y reserva un espacio en memoria, da igual que los valores de los parámetros sean los mismos. Tendremos que ser nosotros los que indiquemos que consideramos dos objetos iguales, podrían ser aquellos que tuvieran todos los parámetros iguales, o también podríamos considerar que dos estudiantes con el mismo nombre son el mismo.

  1. Para definir que condiciones deben de darse para que dos objetos sean iguales, emplearemos el método: equals(Object obj), que todas las clases heredan de la clase padre Object. Además, emplearemos también otros dos métodos heredados de la clase Object: toString() y hashCode(). Estos métodos nos servirán para explicar la diferencia entre las clases HashSet y ArrayList. Todos ellos los implementamos en nuestra clase Estudiante.

Los métodos citados los tenemos que definir en la clase Estudiante y al tratarse de métodos heredados que vamos a personalizar, vendrán precedidos de la instrucción: @Override.

Lo normal es que nuestro IDE nos permita insertar estos métodos de manera automática, como insertamos los constructores o los métodos getters y setters. Los insertamos seleccionando todos los parámetros y obtenemos:

  1. Si ahora ejecutamos nuestro programa de nuevo, empleando la función toString para pintar los objetos, obtenemos el siguiente resultado:

Donde podemos observar que esta vez no introduce en la lista el último usuario “Maria” porque coincide con el primero. Y coincide en todos los parámetros, que es lo que hemos indicado con el método equals(Object obj)

Si cambiáramos cualquier parámetro de uno de los dos objetos con nombre “Maria”, y ejecutamos el programa, volveríamos a tener cuatro elementos en la lista. Por ejemplo, si al crear el último estudiante de nombre “Maria”, indicamos que tiene 20 años, con sólo cambiar ese dato, los dos estudiantes de nombre “Maria” serían diferentes. Ya que hemos definido en equals(Object obj) que para que dos objetos Estudiante sean iguales, todos los parámetros de los dos objetos tienen que ser iguales.

NOTA: Este post es parte de la colección “Java”. Puedes ver el índice de esta colección aquí.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.