Clase IdentityHashMap en Java

IdentityHashMap implementa la interfaz Map usando Hashtable , usando la igualdad de referencia en lugar de la igualdad de objetos al comparar claves (y valores). Esta clase no es una implementación de mapa de propósito general. Si bien esta clase implementa la interfaz Map, viola intencionalmente el contrato general de Map, que exige el uso del método equals() al comparar objetos. Esta clase se utiliza cuando el usuario requiere que los objetos se comparen por referencia. Pertenece al paquete java.util .

Características de IdentityHashMap

  • Sigue la igualdad de referencia, en lugar de usar el método equals(), usa el operador ==.
  • No está sincronizado y debe sincronizarse externamente.
  • Los iteradores fallan rápido, lanzan ConcurrentModificationException en un intento de modificar durante la iteración.
  • Esta clase proporciona un rendimiento de tiempo constante para las operaciones básicas (obtener y poner), asumiendo que la función hash de identidad del sistema (System.identityHashCode(Object)) dispersa los elementos correctamente entre los cubos. IdentityHashMap no usa el método hashCode() sino que usa el método System.identityHashCode(). Esta es una diferencia significativa porque ahora puede usar objetos mutables como clave en Map, cuyo código hash probablemente cambie cuando el mapeo se almacena dentro de IdentityHashMap.

Declaración:

clase pública IdentityHashMap<K,​V> extiende AbstractMap<K,​V> implementa Map<K,​V>, serializable, clonable 
 

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

La jerarquía de IdentityHashMap

IdentityHashMap in Java

Implementa interfaces Serializable , Cloneable , Map<K,​ V> y extiende la clase AbstractMap<K, V> .

Ejemplo:

Java

// Java code to demonstrate IdentityHashMap
 
import java.util.Map;
import java.util.HashMap;
import java.util.IdentityHashMap;
 
public class IdentityHashMapExample
{
    public static void main(String[] args)
    {
        // creating an instance of IdentityHashMap
        Map<String, String> ihm = new IdentityHashMap<>();
 
        // Putting key and value pair
        // in a IdentityHashMap Object
        ihm.put("ihmkey","ihmvalue");
        ihm.put(new String("ihmkey"),"ihmvalue1");
         
        // ihm.size() will print 2 since it
        // compares the objects by reference
        System.out.println("Size of IdentityHashMap--"+ihm.size());
         
    }
}
Producción

Size of IdentityHashMap--2

Constructores de IdentityHashMap

Podemos crear una instancia de IdentityHashMap de dos maneras:

IdentityHashMap<K, V> ihm = new IdentityHashMap<K, V>();
            (or)
Map<K, V> hm = new IdentityHashMap<K, V>();

1. IdentityHashMap():  construye un nuevo mapa hash de identidad vacío con un tamaño máximo esperado predeterminado. 

IdentityHashMap<K, V> ihm = new IdentityHashMap<K, V>();

2. IdentityHashMap(int expectedMaxSize):  Construye un nuevo mapa vacío con el tamaño máximo esperado especificado. 

IdentityHashMap<K, V> ihm = new IdentityHashMap(int MaxSize esperado);

3. IdentityHashMap(Map m):  construye un nuevo mapa hash de identidad que contiene las asignaciones clave-valor en el mapa especificado.

IdentityHashMap<K, V> ihm = new IdentityHashMap(Mapa m);

Operaciones básicas en IdentityHashMap

1. Agregar elementos

Para insertar o agregar mapeo en un IdentityHashMap, tenemos los métodos put() y putAll() . put() puede insertar una clave específica y el valor que está mapeando, en un mapa particular. Si se pasa una clave existente, el valor anterior se reemplaza por el nuevo valor. putAll() copia todos los elementos, es decir, las asignaciones, de un mapa a otro. 

Java

// Java code to illustrate
// adding elements to IdentityHashMap
import java.util.*;
 
public class AddingElementsToIdentityHashMap {
   
    public static void main(String[] args)
    {
        // Creating an empty IdentityHashMap
        Map<Integer, String> identity_hash
            = new IdentityHashMap<Integer, String>();
 
        // Mapping string values to int keys
        // using put() method
        identity_hash.put(10, "Geeks");
        identity_hash.put(15, "4");
        identity_hash.put(20, "Geeks");
        identity_hash.put(25, "Welcomes");
        identity_hash.put(30, "You");
 
        // Displaying the IdentityHashMap
        System.out.println("Initial Mappings are: "
                           + identity_hash);
 
        // Inserting existing key along with new value
          // previous value gets returned and stored in
          // returned_value
        String returned_value
            = (String)identity_hash.put(20, "All");
 
        // Verifying the returned value
        System.out.println("Returned value is: "
                           + returned_value);
 
        // Displaying the new map
        System.out.println("New map is: " + identity_hash);
 
        // Creating a new Identityhash map and copying
        Map<Integer, String> new_Identityhash_map
            = new IdentityHashMap<Integer, String>();
        new_Identityhash_map.putAll(identity_hash);
 
        // Displaying the final IdentityHashMap
        System.out.println("The new map: "
                           + new_Identityhash_map);
    }
}
Producción

Initial Mappings are: {10=Geeks, 25=Welcomes, 30=You, 20=Geeks, 15=4}
Returned value is: Geeks
New map is: {10=Geeks, 25=Welcomes, 30=You, 20=All, 15=4}
The new map: {10=Geeks, 25=Welcomes, 30=You, 20=All, 15=4}

2. Eliminación de elementos
Para eliminar asignaciones, usamos remove() , un método incorporado de la clase IdentityHashMap, y se usa para eliminar la asignación de cualquier clave particular del mapa.

Java

// Java code to illustrate removing
// elements from IdentityHashMap
 
import java.util.*;
 
public class RemovingMappingsFromIdentityHashMap {
    public static void main(String[] args)
    {
 
        // Creating an empty IdentityHashMap
        Map<Integer, String> Identity_hash = new
                    IdentityHashMap<Integer, String>();
     
        // Mapping string values to int keys
        Identity_hash.put(10, "Geeks");
        Identity_hash.put(15, "4");
        Identity_hash.put(20, "Geeks");
        Identity_hash.put(25, "Welcomes");
        Identity_hash.put(30, "You");
 
        // Displaying the IdentityHashMap
        System.out.println("Initial Mappings are: " +
                                        Identity_hash);
 
        // Removing the existing key mapping
        String returned_value =
                        (String)Identity_hash.remove(20);
 
        // Verifying the returned value
        System.out.println("Returned value is: " +
                                    returned_value);
 
        // Displaying the new map
        System.out.println("New map is: " + Identity_hash);
    }
}
Producción

Initial Mappings are: {10=Geeks, 25=Welcomes, 30=You, 20=Geeks, 15=4}
Returned value is: Geeks
New map is: {10=Geeks, 25=Welcomes, 30=You, 15=4}

3. Accediendo a los Elementos

Podemos acceder a los elementos de un IdentityHashMap usando el método get() , el ejemplo de esto se da a continuación.

Java

// Java code to illustrate the accessing
// elements from IdentityHashMap
 
import java.util.*;
 
public class AccessingElementsFromIdentityHashMap {
 
    public static void main(String[] args)
    {
 
        // Creating an empty IdentityHashMap
        Map<Integer, String> identity_hash
            = new IdentityHashMap<Integer, String>();
 
        // Mapping string values to int keys
        identity_hash.put(10, "Geeks");
        identity_hash.put(15, "4");
        identity_hash.put(20, "Geeks");
        identity_hash.put(25, "Welcomes");
        identity_hash.put(30, "You");
 
        // Displaying the IdentityHashMap
        System.out.println("Initial Mappings are: "
                           + identity_hash);
 
        // Getting the value of 25
        System.out.println("The Value is: "
                           + identity_hash.get(25));
 
        // Getting the value of 10
        System.out.println("The Value is: "
                           + identity_hash.get(10));
       
          // Using keySet() to get the set view of keys
        System.out.println("The set is: " + identity_hash.keySet());
           
          // Using entrySet() to get the set view
        System.out.println("The set is: " +
                                identity_hash.entrySet());
    }
}
Producción

Initial Mappings are: {10=Geeks, 25=Welcomes, 30=You, 20=Geeks, 15=4}
The Value is: Welcomes
The Value is: Geeks
The set is: [10, 25, 30, 20, 15]
The set is: [10=Geeks, 25=Welcomes, 30=You, 20=Geeks, 15=4]

4. Atravesar
Podemos usar la interfaz Iterator para atravesar cualquier estructura del marco de la colección. Dado que los iteradores trabajan con un tipo de datos, usamos Entry< ? , ? > para resolver los dos tipos separados en un formato compatible. Luego, usando el método next(), imprimimos los elementos del IdentityHashMap.

Java

// Java code to illustrate the
// iterating over IdentityHashmap
 
import java.util.*;
 
public class IteratingIdentityHashMap {
 
    public static void main(String[] args)
    {
 
        // Creating an empty IdentityHashMap
        IdentityHashMap<Integer, String> identity_hash
            = new IdentityHashMap<Integer, String>();
 
        // Mapping string values to int keys
        identity_hash.put(10, "Geeks");
        identity_hash.put(15, "4");
        identity_hash.put(20, "Geeks");
        identity_hash.put(25, "Welcomes");
        identity_hash.put(30, "You");
 
        // Displaying the IdentityHashMap
        System.out.println("Initial Mappings are: "
                           + identity_hash);
 
        // Create an Iterator over the
        // IdentityHashMap
        Iterator<IdentityHashMap.Entry<Integer, String> >
            itr = identity_hash.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

Initial Mappings are: {10=Geeks, 25=Welcomes, 30=You, 20=Geeks, 15=4}
Key = 10, Value = Geeks
Key = 25, Value = Welcomes
Key = 30, Value = You
Key = 20, Value = Geeks
Key = 15, Value = 4

IdentityHashMap sincronizado

Si varios subprocesos acceden a un mapa hash de identidad al mismo tiempo y al menos uno de los subprocesos modifica el mapa estructuralmente, debe sincronizarse externamente. (Una modificación estructural es cualquier operación que agrega o elimina una o más asignaciones; simplemente cambiar el valor asociado con una clave que ya contiene una instancia no es una modificación estructural). 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. 

Mapa m = Collections.synchronizedMap(new IdentityHashMap(…));

Métodos de IdentityHashMap

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

MÉTODO

DESCRIPCIÓN

clear() Elimina todas las asignaciones de este mapa.
clon() Devuelve una copia superficial de este mapa hash de identidad: las claves y los valores en sí no se clonan.
containsKey​(clave de objeto) Comprueba si la referencia del objeto especificado es una clave en este mapa hash de identidad.
contiene valor (valor del objeto) Comprueba si la referencia del objeto especificado es un valor en este mapa hash de identidad.
conjuntoentrada() Devuelve una vista de conjunto de las asignaciones contenidas en este mapa.
es igual a​(Objeto o) Compara el objeto especificado con este mapa para la igualdad.
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.
código hash() Devuelve el valor del código hash para este mapa.
esta vacio() Devuelve verdadero si este mapa hash de identidad no contiene asignaciones de clave-valor.
juego de llaves() Devuelve una vista de conjunto basada en la identidad de las claves contenidas en este mapa.
poner (tecla K, valor V) Asocia el valor especificado con la clave especificada en este mapa hash de identidad.
putAll​(Map<? extiende K,​? extiende V> m) Copia todas las asignaciones del mapa especificado a este mapa.
eliminar (tecla de objeto) Elimina la asignación de esta clave de este mapa, si está presente.
Talla() Devuelve el número de asignaciones de clave-valor en este mapa hash de identidad.
valores() Devuelve una vista de colección de los valores contenidos en este mapa.

Métodos declarados en la clase java.util.AbstractMap

MÉTODO

DESCRIPCIÓN

 Enstringr() Devuelve una representación de string de este mapa.

Métodos declarados en la interfaz java.util.Map

MÉTODO

DESCRIPCIÓN

 calcular​(tecla K, BiFunction<? super K,​? super V,​? extiende V> función de reasignación) Intenta calcular una asignación para la clave especificada y su valor asignado actual (o nulo si no hay una asignación actual).
ComputeIfAbsent​(tecla K, función <? super K,​? extiende V> función de mapeo) Si la clave especificada aún no está asociada con un valor (o está asignada a un valor nulo), intenta calcular su valor utilizando la función de asignación dada y lo ingresa en este mapa a menos que sea nulo.
ComputeIfPresent​(tecla K, BiFunction<? super K,​? super V,​? extiende V> función de reasignación) Si el valor de la clave especificada está presente y no es nulo, intenta calcular una nueva asignación dada la clave y su valor asignado actual.
forEach​(BiConsumidor<? super K,​? super V> acción) Realiza la acción dada para cada entrada en este mapa hasta que todas las entradas hayan sido procesadas o la acción arroje una excepción.
getOrDefault​(Clave de objeto, V valor predeterminado) Devuelve el valor al que se asigna la clave especificada o defaultValue si este mapa no contiene ninguna asignación para la clave.
fusionar (tecla K, valor V, BiFunction<? super V,​? super V,​? extiende V> función de reasignación) Si la clave especificada aún no está asociada con un valor o está asociada con un valor nulo, la asocia con el valor no nulo proporcionado.
putIfAbsent​(clave K, valor V) Si la clave especificada aún no está asociada con un valor (o está asignada a un valor nulo), la asocia con el valor dado y devuelve un valor nulo; de lo contrario, devuelve el valor actual.
eliminar (clave de objeto, valor de objeto) Elimina la entrada de la clave especificada solo si actualmente está asignada al valor especificado.
reemplazar (tecla K, valor V) Reemplaza la entrada de la clave especificada solo si actualmente está asignada a algún valor.
reemplazar (tecla K, V valor anterior, V valor nuevo) Reemplaza la entrada de la clave especificada solo si actualmente está asignada al valor especificado.
replaceAll​(BiFunction<? super K,​? super V,​? extiende la función V>) Reemplaza el valor de cada entrada con el resultado de invocar la función dada en esa entrada hasta que se hayan procesado todas las entradas o la función produzca una excepción.

IdentityHashMap frente  a HashMap

  • IdentityHashMap usa el operador de igualdad “==” para comparar claves y valores, mientras que HashMap usa el método de igualdad para comparar claves y valores dentro de Map.
  • Dado que IdentityHashMap no usa equals(), es comparativamente más rápido que HashMap para un objeto con equals() costoso.
  • IdentityHashMap no requiere que las claves sean inmutables, ya que no se basa en equals().

El siguiente programa ilustra la diferencia entre la implementación de IdentityHashMap y HashMap.

Java

// Java code to demonstrate IdentityHashMap and
// illustration of how it is different from HashMap
 
import java.util.Map;
import java.util.HashMap;
import java.util.IdentityHashMap;
 
public class IdentityHashMapExample
{
    public static void main(String[] args)
    {
        // Creating HashMap and IdentityHashMap objects
        Map<String, String> hm = new HashMap<>();
        Map<String, String> ihm = new IdentityHashMap<>();
 
        // Putting key and value in HashMap and IdentityHashMap Object
        hm.put("hmkey","hmvalue");
        hm.put(new String("hmkey"),"hmvalue1");
        ihm.put("ihmkey","ihmvalue");
        ihm.put(new String("ihmkey"),"ihmvalue1");
         
        // Print Size of HashMap and WeakHashMap Object
        // hm.size() will print 1 since it compares the objects logically
        // and both the keys are same
        System.out.println("Size of HashMap is : "+hm.size());
         
        // ihm.size() will print 2 since it compares the objects by reference
        System.out.println("Size of IdentityHashMap is : "+ihm.size());
 
         
    }
}
Producción

Size of HashMap is : 1
Size of IdentityHashMap is : 2

Este artículo es una contribución de Pratik Agarwal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

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 *