CodeGym /Blog Java /Random-ES /LinkedHashSet en Java
Autor
Volodymyr Portianko
Java Engineer at Playtika

LinkedHashSet en Java

Publicado en el grupo Random-ES
Hablando de la clase LinkedHashSet en Java, debemos mencionar que implementa la interfaz Set . LinkedHashSet crea una colección que almacena elementos en una tabla hash pero mantiene el orden de inserción de los elementos a diferencia de su contraparte HashSet .

¿Qué se establece en Java?

Recordemos brevemente que la interfaz Set define un conjunto (set). Extiende Collection y define el comportamiento de las colecciones que no permiten elementos duplicados. Por lo tanto, el método add() devuelve falso si se intenta agregar un elemento duplicado al conjunto. La interfaz no define ningún método adicional propio. La interfaz Set se ocupa de la unicidad de los objetos almacenados, la unicidad está determinada por la implementación del método equals() . Por lo tanto, si los objetos de la clase creada se agregarán al Set , es deseable anular el método equals() .

Clase LinkedHashSet

Antes de hablar de la clase LinkedHashSet , debemos mencionar su pariente cercano, la clase HashSet . HashSet implementa la interfaz Set . Crea una colección que almacena los elementos en una tabla hash. Los elementos de una tabla hash se almacenan como pares clave-valor. La clave especifica la celda (o segmento) para almacenar el valor. El contenido de la clave se utiliza para determinar un valor único llamado código hash. Podemos pensar en un código hash como un identificador de objeto, aunque no tiene por qué ser único. Este código hash también sirve como índice en el que se almacenan los datos asociados con la clave. La clase Java LinkedHashSet amplía HashSet sin agregar ningún método nuevo.LinkedHashSet le permite verificar rápidamente la existencia de una entrada, al igual que HashSet , pero contiene una lista ordenada en su interior. Esto significa que almacena el orden de inserción de los elementos. En otras palabras, LinkedHashSet mantiene una lista vinculada de elementos del conjunto en el orden en que se insertaron. Esto permite la iteración ordenada de inserción en un conjunto. Pero esto hace que la clase LinkedHashSet realice operaciones más largas que la clase HashSet .

Características importantes de LinkedHashSet

  • Podemos almacenar elementos únicos solo en un LinkedHashSet

  • LinketHashSet nos permite extraer elementos en el mismo orden en que los insertamos

  • LinkedHashSet no está sincronizado

  • LinkedHashSet permite almacenar elementos nulos

  • LinkedHashSet utiliza una técnica hash para almacenar elementos en un índice específico basado en un código hash

Métodos LinkedHashSet

Además de los métodos heredados de sus clases principales, HashSet define los siguientes métodos:
  • boolean add(Object o) agrega el elemento especificado a este conjunto si aún no está presente.

  • void clear() elimina todos los elementos de este conjunto.

  • Object clone() devuelve una copia superficial de esta instancia de LinkedHashSet : los elementos en sí no se clonan.

  • boolean contains(Object o) devuelve verdadero si este conjunto contiene el elemento especificado.

  • boolean isEmpty() devuelve verdadero si este conjunto no contiene elementos.

  • Iterator iterator() devuelve un iterador sobre los elementos de este conjunto.

  • boolean remove(Object o) elimina el elemento especificado de este conjunto, si está presente.

  • int size() devuelve el número de elementos en este conjunto (su número de elementos).

Ejemplos sencillos de LinkedHashSet En el siguiente ejemplo, mostramos la inicialización del objeto LinkedHashSet y el uso del método add() para completar el conjunto.

import java.util.LinkedHashSet;
import java.util.Set;

   public class LinkedHashSetEx1 {
       public static void main(String[] args) {
//LinkedHashSet() Init            
Set<String> set = new LinkedHashSet<>();
//adding elements to LinkedHashSet 
           set.add("Re"); //first added element 
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");//last added element  


           System.out.println(set);
       }
   }
La salida es:
[Re, Do, Fa, Sol, La, Ti, Mi]
Como puede ver, los elementos de nuestro conjunto aparecieron en el mismo orden en que los colocamos. LinkedHashSet en Java - 1

Ejemplo 2. Agregar un duplicado en LinkedHashSet

Pongamos de nuevo nuestro LinkedHashSet 7 elementos con nombres de partituras musicales y pongamos un nuevo elemento que sea el mismo que uno de los elementos colocados antes.

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetEx2 {
   public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           set.add("Sol");
           System.out.println(set);
       }
   }
La salida del programa está aquí:
[Re, Do, Fa, Sol, La, Ti, Mi]
El resultado del ejemplo dos es exactamente el mismo que en el primer ejemplo. No podemos tener dos elementos similares en la colección LinkedHashSet . Cuando tratamos de poner el segundo, simplemente se ignora.

Ejemplo 3. Eliminación de elementos de LinkedHashSet


import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           System.out.println(set);
           set.remove("Fa");// removing an element from our set
           set.remove("Score");//trying to remove element that isn't in set
           System.out.println(set.remove("Score"));
           System.out.println("Print our set without elements removed: ");
           System.out.println(set);
           set.clear();
           System.out.println("Print out our set after clear command: ");
           System.out.println(set);
       }
   }
La salida del programa está aquí:
[Re, Do, Fa, Sol, La, Ti, Mi] false Imprime nuestro conjunto sin elementos eliminados: [Re, Do, Sol, La, Ti, Mi] Imprime nuestro conjunto después de borrar el comando: []
Como puede ver, el método remove() aplicado a un elemento inexistente no da como resultado un error de programa. Simplemente devuelve falso si el elemento no se eliminó y verdadero si el elemento estaba en LinkedHashSet y luego se eliminó.

LinkedHashSet frente a HashSet

Estas dos clases son parientes cercanos. Sin embargo, dentro de HashSet usa HashMap para almacenar objetos mientras que LinkedHashSet usa LinkedHashMap . Si no necesita mantener el orden de inserción pero necesita almacenar objetos únicos, es más apropiado usar HashSet . Si necesita mantener el orden de inserción de los elementos, LinkedHashSet es su elección. El rendimiento de LinkedHashSet es un poco más lento que HashSet porque LinkedHashSet usa LinkedList interno para mantener el orden de inserción de los elementos. Pongamos un ejemplo:

import java.util.*;

public class LinkedHashSetExample1 {

   public static void main(String[] args) {
       // while regular hash set orders its elements according to its hashcode stamps

       Set<Integer> regularHashSet = new HashSet<>();
       regularHashSet.add(7);
       regularHashSet.add(3);
       regularHashSet.add(5);
       regularHashSet.add(65536);
       regularHashSet.add(9);
       // few duplicates
       regularHashSet.add(5);
       regularHashSet.add(7);

       // next will print:
       // > regularHashSet = [65536, 3, 5, 7, 9]
       System.out.println("regularHashSet = " + regularHashSet);

       // linked hash set keeps order of adding unchanged

       Set<Integer> linkedHashSet = new LinkedHashSet<>();
       linkedHashSet.add(7);
       linkedHashSet.add(3);
       linkedHashSet.add(5);
       linkedHashSet.add(65536);
       linkedHashSet.add(9);
       // few duplicates
       linkedHashSet.add(5);
       linkedHashSet.add(7);

       // next will print:
       // > linkedHashSet = [7, 3, 5, 65536, 9]
       System.out.println("linkedHashSet = " + linkedHashSet);
   }
}
La salida del programa es:
conjuntoHash regular = [65536, 3, 5, 7, 9] conjuntoHash vinculado = [7, 3, 5, 65536, 9]

Uso de Java LinkedHashSet en aplicaciones del mundo real

Dado que LinkedHashSet le permite verificar rápidamente la existencia de una entrada y también almacena el pedido, esta colección parece ser bastante conveniente para eliminar duplicados de una lista. O, por ejemplo, resolver problemas como el último artículo visto recientemente en mi bolso. O, ¿recuerdas un juego así, Pokemon Go? LinkedHashSet puede almacenar una lista de Pokémon que has encontrado y el orden en que se encontraron en tu camino. En este caso, los Pokémon “repetidos” ya no se añadirán a la lista. O, por ejemplo, una lista de jefes por nivel que ya hayas conocido en cualquier juego con niveles. O la historia del descubrimiento de los cuerpos cósmicos. LinkedHashSetle permite verificar rápidamente si un cuerpo espacial ya está en la lista o no, y si no está allí, luego agréguelo a la lista. Tomemos un ejemplo de eliminación de duplicados.

import java.util.*;

class LinkedHashSetExample2 {
   public static void main(String[] args) {
       List<String> listWithDuplicates = List.of("some","elements","with", "few", "duplicates", "were", "here", "duplicates", "duplicates");

       Set<String> linkedHashSet = new LinkedHashSet<>(listWithDuplicates);
       List<String> listWithoutDuplicates = new ArrayList<>(linkedHashSet);

       // next will print:
       // > listWithDuplicates = [some, elements, with, few, duplicates, here, duplicates, duplicates]
       System.out.println("listWithDuplicates = " + listWithDuplicates);
       // next will print:
       // > listWithoutDuplicates = [some, elements, with, few, duplicates, here]
       System.out.println("listWithoutDuplicates = " + listWithoutDuplicates);

       // -------------------------------------------------------------------------

       // while using regular Hash Set will generally produces some unexpected order
       Set<String> regularHashSet = new HashSet<>(listWithDuplicates);

       // next will print:
       // > linkedHashSet = [some, elements, with, few, duplicates, were, here]
       System.out.println("linkedHashSet = " + linkedHashSet);
       // next will print:
       // > regularHashSet = [here, some, with, duplicates, were, elements, few]
       System.out.println("regularHashSet = " + regularHashSet);
   }
}
La salida del programa está aquí:
listWithDuplicates = [algunos, elementos, con, pocos, duplicados, fueron, aquí, duplicados, duplicados] listWithoutDuplicates = [algunos, elementos, con, pocos, duplicados, fueron, aquí] linkedHashSet = [algunos, elementos, con, pocos, duplicados , fueron, aquí] regularHashSet = [aquí, algunos, con, duplicados, fueron, elementos, pocos]
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION