Diferencia entre IdentityHashMap, WeakHashMap y EnumMap en Java

IdentityHashMap, WeakHashMap y EnumMap son todas las clases en la colección Java que implementa la interfaz Map . Pero existen pocas diferencias entre ellos.

1. IdentityHashMap : IdentityHashMap implementa la interfaz Map . Sigue la igualdad de referencia en lugar de la igualdad de objeto al comparar claves (y valores). Esta clase se utiliza cuando el usuario requiere que los objetos se comparen por referencia. No está sincronizado y debe sincronizarse externamente. Los iteradores en esta clase son a prueba de fallas, lanzan ConcurrentModificationException en un intento de modificar durante la iteración.

Funcionamiento de IdentityHashMap:

Java

// Java program to illustrate the
// working of IdentityHashmap
  
import java.util.*;
  
public class IteratingIdentityHashMap {
  
    public static void main(String[] args)
    {
  
        // Creating an empty IdentityHashMap
        IdentityHashMap<Integer, String> ihmap
            = new IdentityHashMap<Integer, String>();
  
        // Mapping string values to int keys
        ihmap.put(10, "Geeks");
        ihmap.put(20, "4");
        ihmap.put(30, "Geeks");
        ihmap.put(40, "Welcomes");
        ihmap.put(50, "You");
  
        // Displaying the size of IdentityHashMap
        System.out.println("IdentityHashMap size : "
                           + ihmap.size());
  
        // Displaying the IdentityHashMap
        System.out.println("Initial identity hash map: "
                           + ihmap);
  
        // Create an Iterator over the
        // IdentityHashMap
        Iterator<IdentityHashMap.Entry<Integer, String> >
            itr = ihmap.entrySet().iterator();
  
        // The hasNext() method is used to check if there is
        // a next element The next() method is used to
        // retrieve the next element
        
        while (itr.hasNext())
        {
            IdentityHashMap.Entry<Integer, String> entry = itr.next();
            
            System.out.println("Key = " + entry.getKey()
                               + ", Value = "
                               + entry.getValue());
        }
    }
}
Producción

IdentityHashMap size : 5
Initial identity hash map: {10=Geeks, 40=Welcomes, 50=You, 30=Geeks, 20=4}
Key = 10, Value = Geeks
Key = 40, Value = Welcomes
Key = 50, Value = You
Key = 30, Value = Geeks
Key = 20, Value = 4

2. WeakHashMap: WeakHashMap es la implementación de la interfaz Map que almacena solo claves débiles. En WeakHashMap, podemos almacenar solo referencias débiles de su clave que permiten que los pares clave-valor se recolecten como basura cuando su clave ya no se usa normalmente. WeakHashMap es la implementación basada en HashTable, pero no está sincronizada. Le permite almacenar tanto la clave nula como los valores nulos.

Funcionamiento de WeakHashMap: 

Java

// Java program to illustrate
// the WeakHashMap
  
import java.util.Collection; 
import java.util.Map; 
import java.util.Set; 
import java.util.WeakHashMap; 
  
class WeakHashMapdemo {
    public static void main(String[] arg)
    {
        Map<Number, String> whmap = new WeakHashMap<Number, String>();
        
        whmap.put(1, "geeks");
        whmap.put(2, "4");
        whmap.put(3, "geeks");
        whmap.put(4, "welcomes");
        whmap.put(5, "you");
  
        // Displaying weak hash map
        System.out.println("WeakHashMap is : " + whmap);
  
        // Checking if "welcomes" exist
        if (whmap.containsValue("welcomes"))
            System.out.println("Yes welcomes exist");
  
        // Checking if 3 exist as a key in map
        if (whmap.containsKey(3))
            System.out.println("Yes 3 exist");
        
        // Creating set for key
        Set keyset = whmap.keySet();
        
        // Displaying key set
        System.out.println("key Set : " + keyset);
        
        Collection values = whmap.values();
        
        // Displaying values of map
        System.out.println("Values : " + values);
  
        // Removing all data
        whmap.clear();
  
        // Checking whether map is empty or not
        if (whmap.isEmpty())
            System.out.println("Empty WeakHashMap: " + whmap);
    }
}
Producción

WeakHashMap is : {5=you, 4=welcomes, 3=geeks, 2=4, 1=geeks}
Yes welcomes exist
Yes 3 exist
key Set : [5, 4, 3, 2, 1]
Values : [you, welcomes, geeks, 4, geeks]
Empty WeakHashMap: {}

3. EnumMap : EnumMap es una implementación especializada de la interfaz Map para tipos de enumeración . Extiende AbstractMap e implementa la interfaz Map en Java. Algunas características importantes de EnumMap son las siguientes: 

  • La clase EnumMap es miembro de Java Collections Framework y no está sincronizada.
  • EnumMap es una colección ordenada, y se mantienen en el orden natural de sus claves (el orden natural de las claves significa el orden en el que se declaran las constantes de enumeración dentro del tipo de enumeración)
  • EnumMap es mucho más rápido que HashMap .
  • Todas las claves de cada instancia de EnumMap deben ser claves del mismo tipo de enumeración .
  • EnumMap no permite insertar una clave nula si intentamos insertar la clave nula, arrojará NullPointerException .
  • EnumMap se representa internamente como arrays, por lo que ofrece el mejor rendimiento.

Funcionamiento de EnumMap:

Java

// Java program to illustrate working
// of EnumMap
  
import java.util.*;
  
class EnumMapExample {
  
    public enum Months {
        January,
        February,
        March,
        April;
    }
  
    public static void main(String[] args)
    {
        // Creating an EnumMap of the Days enum
        EnumMap<Months, Integer> enumMap = new EnumMap<>(Months.class);
  
        // Insert using put() method
        enumMap.put(Months.January, 31);
        enumMap.put(Months.February, 28);
        enumMap.put(Months.March, 31);
        enumMap.put(Months.April, 30);
  
        // Printing size of EnumMap 
        System.out.println("Size of EnumMap: "
                           + enumMap.size());
        // Printing the EnumMap
        for (Map.Entry m : enumMap.entrySet())
        {
            System.out.println(m.getKey() + " "
                               + m.getValue());
        }
    }
}
Producción

Size of EnumMap: 4
January 31
February 28
March 31
April 30

Diferencia entre IdentityHashMap, WeakHashMap y EnumMap:

PROPIEDADES            IdentityHashMap            WeakHashMap            EnumMap
Referencias IdentityHashMap almacena una referencia clave sólida.  WeakHashMap almacena la referencia de clave débil. EnumMap almacena la referencia clave fuerte.
Buscar y obtener los valores Utiliza el operador de igualdad (==) para buscar y obtener los valores. Utiliza el método equals() para ese propósito. También usa el método equals() para ese propósito.
Llaves Permite almacenar cualquier tipo de llaves. También permite almacenar cualquier tipo de llaves. Permite almacenar solo claves de tipo enumeración.
Estructura de datos subrayada Utiliza la array como una estructura de datos subrayada. Utiliza HashTable como una estructura de datos subrayada. Utiliza la array como una estructura de datos subrayada.
iterador El iterador utilizado en IdentityHashMap es Fail-fast. El iterador utilizado en WeakHashMap es Fail-fast. El iterador utilizado en EnumMap es débilmente consistente.
Valores nulos Permite almacenar valores nulos. Permite almacenar valores nulos. No permite almacenar valores nulos

Publicación traducida automáticamente

Artículo escrito por prashant_srivastava 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 *