LinkedHashMap en Java

La clase LinkedHashMap es como HashMap con una característica adicional de mantener un orden de elementos insertados en ella. HashMap proporcionó la ventaja de una inserción, búsqueda y eliminación rápidas, pero nunca mantuvo el seguimiento y el orden de inserción, que proporciona LinkedHashMap donde se puede acceder a los elementos en su orden de inserción. 

Las características importantes de un LinkedHashMap se enumeran a continuación:

  • Un LinkedHashMap contiene valores basados ​​en la clave. Implementa la interfaz Map y amplía la clase HashMap.
  • Contiene sólo elementos únicos.
  • Puede tener una clave nula y múltiples valores nulos.
  • No está sincronizado.
  • Es lo mismo que HashMap con la característica adicional de que mantiene el orden de inserción. Por ejemplo, cuando ejecutamos el código con un HashMap, obtenemos un orden diferente de elementos.

Declaración:

public class LinkedHashMap<K,​V> extends HashMap<K,​V> implements Map<K,​V>

Aquí, K es el tipo de objeto clave y V es el tipo de objeto de valor

  • K – El tipo de claves en el mapa.
  • V – El tipo de valores mapeados en el mapa.

Implementa la interfaz Map<K, V> y amplía la clase HashMap<K, V> . Aunque la Jerarquía de LinkedHashMap es como se muestra en los siguientes medios de la siguiente manera :

¿Cómo funciona LinkedHashMap internamente?

Un LinkedHashMap es una extensión de la clase HashMap e implementa la interfaz Map . Por lo tanto, la clase se declara como:

public class LinkedHashMap 
extends HashMap 
implements Map 

En esta clase, los datos se almacenan en forma de Nodes. La implementación de LinkedHashMap es muy similar a una lista doblemente enlazada . Por lo tanto, cada Node del LinkedHashMap se representa como:

LinkedHashMap-Node-in-Java

  • Hash: todas las claves de entrada se convierten en un hash, que es una forma más corta de la clave para que la búsqueda y la inserción sean más rápidas.
  • Clave: dado que esta clase extiende HashMap, los datos se almacenan en forma de un par clave-valor. Por lo tanto, este parámetro es la clave de los datos.
  • Valor: para cada clave, hay un valor asociado a ella. Este parámetro almacena el valor de las claves. Debido a los genéricos, este valor puede ser de cualquier forma.
  • Siguiente: dado que LinkedHashMap almacena la orden de inserción, esta contiene la dirección del siguiente Node de LinkedHashMap.
  • Anterior: este parámetro contiene la dirección del Node anterior de LinkedHashMap.

LinkedHashMap sincronizado

La implementación de LinkedHashMap no está sincronizada. Si varios subprocesos acceden a un mapa hash vinculado al mismo tiempo y al menos uno de los subprocesos modifica el mapa estructuralmente, debe sincronizarse externamente. Esto generalmente se logra mediante la sincronización en algún objeto que encapsula naturalmente el mapa. Si no existe tal objeto, el mapa debe «envolverse» utilizando el método Collections.synchronizedMap . Es mejor hacerlo en el momento de la creación, para evitar el acceso no sincronizado accidental al mapa:

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

Constructores de la clase LinkedHashMap

Para crear un LinkedHashMap , necesitamos crear un objeto de la clase LinkedHashMap. La clase LinkedHashMap consta de varios constructores que permiten la posible creación de ArrayList. Los siguientes son los constructores disponibles en esta clase:

1. LinkedHashMap(): se utiliza para construir un constructor LinkedHashMap predeterminado.

LinkedHashMap<K, V> lhm = new LinkedHashMap<K, V>();

2. LinkedHashMap (capacidad int): se utiliza para inicializar un LinkedHashMap particular con una capacidad específica.

LinkedHashMap<K, V> lhm = new LinkedHashMap<K, V>(int capacity);

3. LinkedHashMap(Map <? extends K ,​? extends V > map ): Se utiliza para inicializar un LinkedHashMap particular con los elementos del mapa especificado.

LinkedHashMap<K, V> lhm = new LinkedHashMap<K, V>(Map<? extends K,​? extends V> map);

4. LinkedHashMap(int capacity, float fillRatio): se utiliza para inicializar tanto la capacidad como la tasa de llenado de un LinkedHashMap. Un fillRatio también llamado loadFactor es una métrica que determina cuándo aumentar el tamaño del LinkedHashMap automáticamente. De forma predeterminada, este valor es 0,75, lo que significa que el tamaño del mapa aumenta cuando el mapa está lleno en un 75 %.

LinkedHashMap<K, V> lhm = new LinkedHashMap<K, V>(int capacity, float fillRatio);

5. LinkedHashMap(int capacity, float fillRatio, boolean Order): este constructor también se utiliza para inicializar tanto la capacidad como la tasa de llenado de un LinkedHashMap junto con si se debe seguir el orden de inserción o no.

LinkedHashMap<K, V> lhm = new LinkedHashMap<K, V>(int capacity, float fillRatio, boolean Order);

Aquí, para el atributo Pedido , se pasa verdadero para el último pedido de acceso y falso para el pedido de inserción.

 Métodos de LinkedHashMap 

MÉTODO

DESCRIPCIÓN

contiene valor (valor del objeto) Devuelve verdadero si este mapa asigna una o más claves al valor especificado.
conjuntoentrada() Devuelve una vista de conjunto de las asignaciones contenidas en este mapa.
obtener (clave de objeto) Devuelve el valor al que se asigna la clave especificada, o nulo si este mapa no contiene ninguna asignación para la clave.
juego de llaves() Devuelve una vista de conjunto de las claves contenidas en este mapa.
removeEldestEntry​(Map.Entry<K,​V> mayor) Devuelve verdadero si este mapa debe eliminar su entrada más antigua.
valores() Devuelve una vista de colección de los valores contenidos en este mapa.

Aplicación: dado que LinkedHashMap utiliza Doubly LinkedList para mantener el orden de inserción, podemos implementar la funcionalidad LRU Cache anulando el método removeEldestEntry() para imponer una política para eliminar automáticamente obsoletos cuando se agregan nuevas asignaciones al mapa. Esto le permite caducar los datos utilizando algunos criterios que defina.

Ejemplo:

Java

// Java Program to Demonstrate Working of LinkedHashMap
 
// Importing required classes
import java.util.*;
 
// LinkedHashMapExample
public class GFG {
 
    // Main driver method
    public static void main(String a[])
    {
 
        // Creating an empty LinkedHashMap
        LinkedHashMap<String, String> lhm
            = new LinkedHashMap<String, String>();
 
        // Adding entries in Map
        // using put() method
        lhm.put("one", "practice.geeksforgeeks.org");
        lhm.put("two", "code.geeksforgeeks.org");
        lhm.put("four", "quiz.geeksforgeeks.org");
 
        // Printing all entries inside Map
        System.out.println(lhm);
 
        // Note: It prints the elements in same order
        // as they were inserted
 
        // Getting and printing value for a specific key
        System.out.println("Getting value for key 'one': "
                           + lhm.get("one"));
 
        // Getting size of Map using size() method
        System.out.println("Size of the map: "
                           + lhm.size());
 
        // Checking whether Map is empty or not
        System.out.println("Is map empty? "
                           + lhm.isEmpty());
 
        // Using containsKey() method to check for a key
        System.out.println("Contains key 'two'? "
                           + lhm.containsKey("two"));
 
        // Using containsKey() method to check for a value
        System.out.println(
            "Contains value 'practice.geeks"
            + "forgeeks.org'? "
            + lhm.containsValue("practice"
                                + ".geeksforgeeks.org"));
 
        // Removing entry using remove() method
        System.out.println("delete element 'one': "
                           + lhm.remove("one"));
 
        // Printing mappings to the console
        System.out.println("Mappings of LinkedHashMap : "
                           + lhm);
    }
}
Producción

{one=practice.geeksforgeeks.org, two=code.geeksforgeeks.org, four=quiz.geeksforgeeks.org}
Getting value for key 'one': practice.geeksforgeeks.org
Size of the map: 3
Is map empty? false
Contains key 'two'? true
Contains value 'practice.geeksforgeeks.org'? true
delete element 'one': practice.geeksforgeeks.org
Mappings of LinkedHashMap : {two=code.geeksforgeeks.org, four=quiz.geeksforgeeks.org}

 Varias operaciones en la clase LinkedHashMap

Veamos cómo realizar algunas operaciones de uso frecuente en la instancia de la clase LinkedHashMap.

Operación 1: Adición de elementos

Para agregar un elemento a LinkedHashMap, podemos usar el método put(). Esto es diferente de HashMap porque en HashMap , el orden de inserción no se conserva, pero se conserva en LinkedHashMap. 

Ejemplo

Java

// Java Program to Demonstrate Adding
// Elements to a LinkedHashMap
 
// Importing required classes
import java.util.*;
 
// Main class
// AddElementsToLinkedHashMap
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Initialization of a LinkedHashMap
        // using Generics
        LinkedHashMap<Integer, String> hm1
            = new LinkedHashMap<Integer, String>();
 
        // Add mappings to Map
        // using put() method
        hm1.put(3, "Geeks");
        hm1.put(2, "For");
        hm1.put(1, "Geeks");
 
        // Printing mappings to the console
        System.out.println("Mappings of LinkedHashMap : "
                           + hm1);
    }
}
Producción

Mappings of LinkedHashMap : {3=Geeks, 2=For, 1=Geeks}

Operación 2: Cambiar/Actualizar Elementos

Después de agregar elementos, si deseamos cambiar el elemento, se puede hacer agregando nuevamente el elemento usando el método put(). Dado que los elementos en LinkedHashMap se indexan usando las claves, el valor de la clave se puede cambiar simplemente reinsertando el valor actualizado para la clave que deseamos cambiar.

Ejemplo

Java

// Java Program to Demonstrate Updation of Elements
// of LinkedHashMap
 
import java.util.*;
 
// Main class
// UpdatingLinkedHashMap
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Initialization of a LinkedHashMap
        // using Generics
        LinkedHashMap<Integer, String> hm
            = new LinkedHashMap<Integer, String>();
 
        // Inserting mappings into Map
        // using put() method
        hm.put(3, "Geeks");
        hm.put(2, "Geeks");
        hm.put(1, "Geeks");
 
        // Printing mappings to the console
        System.out.println("Initial map : " + hm);
 
        // Updating the value with key 2
        hm.put(2, "For");
 
        // Printing the updated Map
        System.out.println("Updated Map : " + hm);
    }
}
Producción

Initial map : {3=Geeks, 2=Geeks, 1=Geeks}
Updated Map : {3=Geeks, 2=For, 1=Geeks}

Operación 3: Quitar elemento

Para eliminar un elemento de LinkedHashMap, podemos usar el método remove(). Este método toma el valor de la clave como entrada, busca la existencia de dicha clave y luego elimina la asignación de la clave de este LinkedHashMap si está presente en el mapa. Aparte de eso, también podemos eliminar el primer elemento ingresado del mapa si se define el tamaño máximo.

Ejemplo

Java

// Java program to Demonstrate Removal of Elements
// from LinkedHashMap
 
// Importing utility classes
import java.util.*;
 
// Main class
// RemovingMappingsFromLinkedHashMap
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
        // Initialization of a LinkedHashMap
        // using Generics
        LinkedHashMap<Integer, String> hm
            = new LinkedHashMap<Integer, String>();
 
        // Inserting the Elements
        // using put() method
        hm.put(3, "Geeks");
        hm.put(2, "Geeks");
        hm.put(1, "Geeks");
        hm.put(4, "For");
 
        // Printing the mappings to the console
        System.out.println("Initial Map : " + hm);
 
        // Removing the mapping with Key 4
        hm.remove(4);
 
        // Printing the updated map
        System.out.println("Updated Map : " + hm);
    }
}
Producción

Initial Map : {3=Geeks, 2=Geeks, 1=Geeks, 4=For}
Updated Map : {3=Geeks, 2=Geeks, 1=Geeks}

 Operación 4: Iterando a través de LinkedHashMap

Hay varias formas de iterar a través de LinkedHashMap. La forma más famosa es usar un bucle for-each sobre la vista establecida del mapa (obtenido usando el método de instancia map.entrySet()). Luego, para cada entrada (elemento de conjunto), los valores de clave y valor se pueden obtener utilizando el método getKey() y getValue() .

Ejemplo

Java

// Java program to demonstrate
// Iterating over LinkedHashMap
 
// Importing required classes
import java.util.*;
 
// Main class
// IteratingOverLinkedHashMap
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Initialization of a LinkedHashMap
        // using Generics
        LinkedHashMap<Integer, String> hm
            = new LinkedHashMap<Integer, String>();
 
        // Inserting elements into Map
        // using put() method
        hm.put(3, "Geeks");
        hm.put(2, "For");
        hm.put(1, "Geeks");
 
        // For-each loop for traversal over Map
        for (Map.Entry<Integer, String> mapElement :
             hm.entrySet()) {
 
            Integer key = mapElement.getKey();
 
            // Finding the value
            // using getValue() method
            String value = mapElement.getValue();
 
            // Printing the key-value pairs
            System.out.println(key + " : " + value);
        }
    }
}
Producción

3 : Geeks
2 : For
1 : Geeks

Artículos relacionados: 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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