Diferencias entre IdentityHashMap y HashMap

Los HashMap e IdentityHashMap se emplean para almacenar una serie de valores u objetos accesibles a través de su clave.

Durante unos cuantos años he trabajado con estas dos clases indistintamente en mis trabajos de clase y no recuerdo que alguien me comunicase que existían diferencias notables entre ellas. Supongo que a otros muchos les pasa lo mismo y se acostumbran al uso de una de ellas empleándola para todo hasta que un día un programa no funciona como se esperaba y no aparece el error por ningún lado.

La gran diferencia entre estas dos clases es como realizan la comparación de la clave o ‘key’ cuando se quiere acceder o insertar un dato almacenado en el Map. IdentityHashMap emplea el operador ‘==’ mientras que HashMap hace uso del método ‘equals()’.

Para quien no recuerde sus primeras clases de programación Java, aclarar que el operador ‘==’ comprueba las referencias de los objetos por lo que ante el siguiente código en una función que devuelva un valor boolean el resultado sería ‘true’. Ya que tanto ‘a’ como ‘b’ hacen referencia al mismo String “hola”.

String a=”hola”;
String b=”hola”;
return a==b;

En este otro caso sin embargo el resultado sería ‘false’ pues ‘a’ tiene la referencia a “hola” mientras que ‘b’ a un nuevo String cuyo contenido es “hola”.

String a=”hola”;
String b=new String(“hola”);
return a==b;

El método ‘equals()’ empleado por los HashMap, comprueba que los valores de los dos objetos a igualar tengan el mismo valor. En ambos ejemplos el resultado sería ‘true’ en este caso.

String a=”hola”;
String b=”hola”;
return a.equals(b);
String a=”hola”;
String b=new String(“hola”);
return a.equals(b);

Una vez aclarados estos conceptos básicos veamos como afecta esto a la hora de introducir un nuevo valor junto a su ‘key’ tanto en los HashMap como en los IdentityHashMap.


import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
public class IdentityMap {public static void main(String[] args) {
    Map identityHashMap = new IdentityHashMap();
    Map hashMap = new HashMap();identityHashMap.put("a", 1);
    identityHashMap.put(new String("a"), 2);
    identityHashMap.put("a", 3);hashMap.put("a", 1);
    hashMap.put(new String("a"), 2);
    hashMap.put("a", 3);

    System.out.println("Número de elementos IdentityHashMap: " + identityHashMap.keySet().size());
    System.out.println("Número de elementos HashMap" + hashMap.keySet().size());

 }

El resultado sería:

Número de elementos IdentityHashMap: 2
Número de elementos HashMap: 1

Esto sucede ya que cuando en el IdentityHashMap introducimos dos valores mediante la clave “a”, esta es tomada como la misma entrada guardándose solo una, mientras que el ‘new String(“a”)’ representa un nuevo String y por lo tanto una nueva referencia. Por otro lado en el HashMap, al examinarse solamente el valor, e ignorarse la referencia entre ellos, los tres valores son iguales.

Tras todo esto, espero que tengáis más claro cuando usar el IdentityHashMap y cuando un HashMap, ya que  en proyectos complejos esta decisión puede acarrear serios problemas difíciles de encontrar.

Anuncios

Una respuesta a “Diferencias entre IdentityHashMap y HashMap

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s