¿Cuál es la diferencia entre HashMap y Hashtable? Esta es una de las preguntas más frecuentes en las entrevistas para los profesionales de Java/J2EE. Ambas clases, HashMap y Hashtable, implementan la interfaz java.util.Map, sin embargo hay diferencias en la forma en que funcionan y en su uso. Aquí discutiremos las diferencias entre estas clases.
HashMap vs Hashtable
1) HashMap no está sincronizado. Esto significa que si se usa en un entorno multi-hilo, entonces más de un hilo puede acceder y procesar el HashMap simultáneamente.
Hashtable está sincronizado. Asegura que no más de un hilo puede acceder a la Hashtable en un momento dado. El hilo que trabaja en el Hashtable adquiere un bloqueo en él para hacer que los otros hilos esperen hasta que su trabajo se complete.
2) HashMap permite una llave nula y cualquier número de valores nulos.
Hashtable no permite llaves nulas y valores nulos.
3) La implementación de HashMap LinkedHashMap mantiene el orden de inserción y TreeMap ordena los mapeos en base al orden ascendente de las llaves.
Hashtable no garantiza ningún tipo de orden. No mantiene los mapeos en ningún orden particular.
4) Inicialmente Hashtable no era la parte del marco de la colección se ha hecho un miembro del marco de la colección más tarde después de haber sido actualizado para implementar la interfaz del Mapa.
HashMap implementa la interfaz del Mapa y es parte del marco de la colección desde el principio.
5) Otra diferencia entre estas clases es que el Iterator del HashMap es un fail-fast y lanza ConcurrentModificationException si cualquier otro Thread modifica el mapa estructuralmente agregando o quitando cualquier elemento excepto el propio método remove() del iterator. En palabras simples, fail-fast significa: Cuando se llama iterator.next(), si se ha hecho alguna modificación entre el momento en que se creó el iterator y el momento en que se llama next(), se lanza inmediatamente una ConcurrentModificationException.
El numerador para el Hashtable no es rápido.
Por ejemplo.
HashMap:
HashMap hm= nuevo HashMap();.........Set keys = hm.keySet();for (Clave de objeto : keys) { //arrojará la ConcurrentModificationException aquí hm.put(par de objeto y valor aquí); }
Hashtable:
Hashtable ht= nuevo Hashtable();..........Enumeración de claves = ht.keys(); for (Enumeración en = ht.elements() ; en.hasMoreElements() ; en.nextElement()) { //No se lanzará ninguna excepción aquí ht.put(par de claves y valores aquí); }
¿Cuándo usar HashMap y Hashtable?
1) Como se dijo anteriormente la principal diferencia entre HashMap y Hashtable es la sincronización. Si hay una necesidad de operación segura de hilos entonces Hashtable puede ser usado ya que todos sus métodos están sincronizados pero es una clase de legado y debe ser evitada ya que no hay nada en ella, lo cual no puede ser hecho por HashMap. Para el entorno multi-hilo te recomendaría usar ConcurrentHashMap (casi similar a Hashtable) o incluso puedes hacer que el HashMap se sincronice explícitamente (Lee aquí..).
2) La operación sincronizada da un pobre rendimiento por lo que debe evitarse hasta que, a menos que sea necesario. Por lo tanto, para un entorno sin hilos HashMap debe ser utilizado sin ninguna duda.