Pregunta Diferencias entre HashMap y Hashtable?


¿Cuáles son las diferencias entre un HashMap y un Hashtable en Java?

¿Cuál es más eficiente para aplicaciones sin hilos?


3113
2017-09-02 20:12


origen


Respuestas:


Hay varias diferencias entre HashMap y Hashtable en Java:

  1. Hashtable es sincronizado, mientras que HashMap no es. Esto hace HashMap es mejor para aplicaciones sin hilos, ya que los objetos no sincronizados generalmente funcionan mejor que los sincronizados.

  2. Hashtable no permite null llaves o valores HashMap permite uno null clave y cualquier cantidad de null valores.

  3. Una de las subclases de HashMap es LinkedHashMap, por lo que, en caso de que desee un orden de iteración predecible (que es el orden de inserción predeterminado), puede cambiar fácilmente el HashMap para LinkedHashMap. Esto no sería tan fácil si estuvieras usando Hashtable.

Como la sincronización no es un problema para ti, te recomendaría HashMap. Si la sincronización se convierte en un problema, también puede mirar ConcurrentHashMap.


3203
2017-09-02 23:02



Tenga en cuenta que muchas de las respuestas indican que Hashtable está sincronizado. En la práctica, esto te compra muy poco.  La sincronización está en los métodos de acceso / mutador que detendrán o eliminarán dos subprocesos del mapa al mismo tiempo, pero en el mundo real a menudo necesitará una sincronización adicional.

Una expresión muy común es "verificar y poner", es decir, buscar una entrada en el mapa y agregarla si aún no existe. Esto no es de ninguna manera una operación atómica si usas Hashtable o HashMap.

Un HashMap sincronizado de forma equivalente se puede obtener de la siguiente manera:

Collections.synchronizedMap(myMap);

Pero para implementar correctamente esta lógica, necesitas sincronización adicional de la forma:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Incluso iterar sobre las entradas de un Hashtable (o un HashMap obtenido por Collections.synchronizedMap) no es seguro para subprocesos a menos que también evite que el Mapa se modifique mediante una sincronización adicional.

Implementaciones de ConcurrentMapa interfaz (por ejemplo ConcurrentHashMap) resolver algo de esto mediante la inclusión semántica segura de verificación y luego acto como:

ConcurrentMap.putIfAbsent(key, value);

580
2017-09-03 11:00



Nadie menciona el hecho de que Hashtable es no parte de Java Collections Framework: solo proporciona una API similar. También, Hashtable se considera código heredado. No hay nada sobre Hashtable eso no se puede hacer usando HashMap o derivaciones de HashMap, entonces, para el nuevo código, no veo ninguna justificación para volver a Hashtable.


287
2018-06-25 01:46



Esta pregunta a menudo se hace en una entrevista para verificar si el candidato comprende el uso correcto de las clases de recolección y conoce las soluciones alternativas disponibles.

  1. La clase HashMap es más o menos equivalente a Hashtable, excepto que no está sincronizado y permite valores nulos. (HashMap permite valores nulos como clave y valor mientras que Hashtable no permite valores nulos).
  2. HashMap no garantiza que el orden del mapa permanezca constante a lo largo del tiempo.
  3. HashMap no está sincronizado mientras que Hashtable está sincronizado.
  4. El iterador en el HashMap es a prueba de fallas mientras que el enumerador del Hashtable no lo es y lanza ConcurrentModificationException si cualquier otro Thread modifica estructuralmente el mapa agregando o eliminando cualquier elemento excepto el propio método remove () de Iterator. Pero este no es un comportamiento garantizado y lo hará JVM con el mejor esfuerzo.

Nota sobre algunos términos importantes

  1. Sincronizado significa que solo un hilo puede modificar una tabla hash en un punto del tiempo. Básicamente, significa que cualquier hilo antes de realizar una actualización en una tabla hash tendrá que adquirir un bloqueo en el objeto, mientras que otros esperarán a que se libere el bloqueo.
  2. Fail-safe es relevante desde el contexto de los iteradores. Si se ha creado un iterador en un objeto de colección y algún otro subproceso intenta modificar el objeto de la colección "estructuralmente", se lanzará una excepción de modificación simultánea. Sin embargo, es posible que otros hilos invoquen el método "set" ya que no modifica la colección "estructuralmente". Sin embargo, si antes de llamar a "establecer", la colección se ha modificado estructuralmente, se lanzará "IllegalArgumentException".
  3. La modificación estructural significa eliminar o insertar elementos que podrían cambiar efectivamente la estructura del mapa.

HashMap se puede sincronizar por

Map m = Collections.synchronizeMap(hashMap);

El mapa proporciona vistas de colección en lugar de soporte directo para la iteración  a través de objetos de enumeración. Las vistas de colección mejoran mucho  expresividad de la interfaz, como se discutirá más adelante en esta sección.  El mapa le permite iterar sobre claves, valores o pares clave-valor;  Hashtable no proporciona la tercera opción. El mapa proporciona una forma segura  para eliminar entradas en medio de la iteración; Hashtable no.  Finalmente, Map corrige una deficiencia menor en la interfaz Hashtable.  Hashtable tiene un método llamado contains, que devuelve true si  Hashtable contiene un valor dado. Dado su nombre, esperarías esto  método para devolver verdadero si el Hashtable contenía una clave dada, porque  la clave es el mecanismo de acceso primario para una Hashtable. El mapa  interfaz elimina esta fuente de confusión mediante el cambio de nombre del método  containsValue. Además, esto mejora la consistencia de la interfaz -  containsValue parallels containsKey.

La interfaz de mapa


148
2017-10-04 06:39



HashMap: Una implementación de la Map interfaz que usa códigos hash para indexar una matriz. Hashtable: Hola, 1998 llamado. Quieren recuperar su API de colecciones.

En serio, es mejor que se mantenga alejado de Hashtable en total. Para aplicaciones de subproceso único, no necesita la sobrecarga adicional de sincronización. Para aplicaciones altamente concurrentes, la sincronización paranoide puede provocar inanición, interbloqueos o pausas innecesarias de recolección de basura. Como señaló Tim Howland, podrías usar ConcurrentHashMap en lugar.


107
2017-09-02 23:14



Manten eso en mente HashTable era una clase heredada antes de que se introdujera Java Collections Framework (JCF) y luego se adaptó para implementar el Map interfaz. Así fue Vector y Stack.

Por lo tanto, siempre mantente alejado de ellos en el nuevo código ya que siempre hay una mejor alternativa en el JCFcomo otros habían señalado.

Aquí está el Trucos de la colección Java que encontrarás útil. Observe que el bloque gris contiene la clase heredada HashTable, Vector y Stack.

enter image description here


104
2018-03-25 08:58



Además de lo que izb dijo, HashMap permite valores nulos, mientras que Hashtable no.

También tenga en cuenta que Hashtable extiende el Dictionary clase, que como el Javadocs estado, es obsoleto y ha sido reemplazado por Map interfaz.


58
2017-09-02 20:30



Eche un vistazo a esta tabla. Proporciona comparaciones entre diferentes estructuras de datos junto con HashMap y Hashtable. La comparación es precisa, clara y fácil de entender.

Matriz de recopilación de Java


50
2017-11-20 05:35