¿Cuáles son las diferencias entre a HashMap
y a Hashtable
en Java?
¿Cuál es más eficiente para aplicaciones sin rosca?
java
collections
hashmap
hashtable
dmanxiii
fuente
fuente
ConcurrentMap
es necesario aquí, ya que la Pregunta dice "aplicaciones sin subprocesos", lo que significa que el enhebrado / concurrencia no es un problema.Respuestas:
Hay varias diferencias entre
HashMap
yHashtable
en Java:Hashtable
está sincronizado , mientrasHashMap
que no lo está. EstoHashMap
mejora las aplicaciones sin subprocesos, ya que los objetos no sincronizados suelen funcionar mejor que los sincronizados.Hashtable
no permitenull
claves o valores.HashMap
permite unanull
clave y cualquier cantidad denull
valores.Una de las subclases de HashMap es
LinkedHashMap
, por lo que en el caso de que desee un orden de iteración predecible (que es el orden de inserción por defecto), puede cambiar fácilmente elHashMap
por aLinkedHashMap
. Esto no sería tan fácil si estuviera usandoHashtable
.Dado que la sincronización no es un problema para usted, lo recomendaría
HashMap
. Si la sincronización se convierte en un problema, también puede mirarConcurrentHashMap
.fuente
Collections.synchronizedMap()
.Hashtable
("¡sincronizar cada método debería ocuparse de cualquier problema de concurrencia!") Lo hace mucho peor para las aplicaciones de subprocesos. Es mejor sincronizar externamente unHashMap
(y pensar en las consecuencias), o usar unaConcurrentMap
implementación (y explotar su API extendida para la concurrencia). En pocas palabras: la única razón para usarHashtable
es cuando una API heredada (desde aproximadamente 1996) lo requiere.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 / mutación para que dos hilos se agreguen o se eliminen del mapa simultáneamente, pero en el mundo real a menudo necesitará una sincronización adicional.
Un modismo muy común es "verificar luego poner", es decir, buscar una entrada en el
Map
, y agregarlo si aún no existe. Esto no es de ninguna manera una operación atómica, ya sea que useHashtable
oHashMap
.Se
HashMap
puede obtener una sincronización equivalente mediante:Pero para implementar correctamente esta lógica, necesita sincronización adicional del formulario:
Incluso iterar sobre
Hashtable
las entradas de un (o unHashMap
obtenido porCollections.synchronizedMap
) no es seguro para subprocesos a menos que también evite queMap
se modifique mediante una sincronización adicional.Las implementaciones de la
ConcurrentMap
interfaz (por ejemploConcurrentHashMap
) resuelven algo de esto mediante la inclusión de semánticas seguras para comprobar y luego actuar como:fuente
Hashtable
se considera código heredado. No hay nada de esoHashtable
que no se pueda hacer usandoHashMap
o derivaciones deHashMap
, por lo que para el nuevo código, no veo ninguna justificación para volver a hacerloHashtable
.fuente
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 si conoce las soluciones alternativas disponibles.
HashMap
clase es más o menos equivalente aHashtable
, excepto que no está sincronizada y permite valores nulos. (HashMap
permite valores nulos como clave y valor, mientrasHashtable
que no permitenull
s).HashMap
no garantiza que el orden del mapa se mantendrá constante en el tiempo.HashMap
no está sincronizado mientras queHashtable
está sincronizado.HashMap
es a prueba de fallas, mientras que el enumerador para elHashtable
no lo es y arrojaConcurrentModificationException
si cualquier otro hilo modifica estructuralmente el mapa agregando o eliminando cualquier elemento, exceptoIterator
el propioremove()
método. Pero este no es un comportamiento garantizado y JVM lo hará con el mejor esfuerzo.Nota sobre algunos términos importantes:
Hashtable
tendrá que adquirir un bloqueo en el objeto, mientras que otros esperarán a que se libere el bloqueo.set
método ya que no modifica la colección "estructuralmente". Sin embargo, si antes de llamarset
, la colección se ha modificado estructuralmente,IllegalArgumentException
será arrojada.HashMap
puede ser sincronizado porMap 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 en gran medida la expresividad de la interfaz, como se describe más adelante en esta sección. Map le permite iterar sobre claves, valores o pares clave-valor;
Hashtable
No proporciona la tercera opción. El mapa proporciona una forma segura de eliminar entradas en medio de la iteración;Hashtable
No. Finalmente, Map corrige una deficiencia menor en laHashtable
interfaz.Hashtable
tiene un método llamado contiene, que devuelve verdadero siHashtable
contiene un valor dado. Dado su nombre, esperaría que este método devuelva verdadero siHashtable
contuviera una clave dada, porque la clave es el mecanismo de acceso principal para a . Además, esto mejora la consistencia de la interfaz - paralelosHashtable
. La interfaz de Map elimina esta fuente de confusión al renombrar el métodocontainsValue
containsValue
containsKey
.fuente
set
operación en aHashMap
. 3) Laput(...)
operación no se lanzaráIllegalArgumentException
si hubo un cambio previo. 4) El comportamiento de falla rápidaHashMap
también se produce si cambia una asignación. 5) El comportamiento a prueba de fallas está garantizado. (Lo que no está garantizado es el comportamiento de unHashTable
si realiza una modificación concurrente. El comportamiento real es ... impredecible)Hashtable
tampoco garantiza que el orden de los elementos del mapa sea estable en el tiempo. (Quizás te estés confundiendoHashtable
conLinkedHashMap
.)thing.set(thing.get() + 1);
la que más a menudo que no coge por sorpresa novatos como totalmente desprotegidos, especialmente si elget()
yset()
son métodos sincronizados. Muchos de ellos esperan magia.HashMap
: Una implementación de laMap
interfaz que utiliza códigos hash para indexar una matriz.Hashtable
: Hola, 1998 llamado. Quieren recuperar sus API de colecciones.En serio, es mejor que te mantengas alejado de
Hashtable
todo. Para aplicaciones de subproceso único, no necesita la sobrecarga adicional de sincronización. Para aplicaciones altamente concurrentes, la sincronización paranoica puede conducir a la inanición, puntos muertos o pausas innecesarias de recolección de basura. Como señaló Tim Howland, podría usarConcurrentHashMap
en su lugar.fuente
Tenga en cuenta que
HashTable
era una clase heredada antes de que se introdujera Java Collections Framework (JCF) y que luego se modificó para implementar laMap
interfaz. Así fueVector
yStack
.Por lo tanto, siempre manténgase alejado de ellos en el nuevo código, ya que siempre hay una mejor alternativa en el JCF como otros han señalado.
Aquí está la hoja de trucos de la colección Java que le resultará útil. Observe que el bloque gris contiene la clase heredada HashTable, Vector y Stack.
fuente
Hay muchas buenas respuestas ya publicadas. Estoy agregando algunos puntos nuevos y resumiéndolo.
HashMap
yHashtable
ambos se usan para almacenar datos en forma de clave y valor . Ambos utilizan la técnica de hashing para almacenar claves únicas. Pero hay muchas diferencias entre las clases HashMap y Hashtable que se dan a continuación.HashMap
HashMap
no está sincronizado No es seguro para subprocesos y no se puede compartir entre muchos subprocesos sin un código de sincronización adecuado.HashMap
permite una clave nula y múltiples valores nulos.HashMap
es una nueva clase introducida en JDK 1.2.HashMap
es rápido.HashMap
sincronizarlo llamando a este códigoMap m = Collections.synchronizedMap(HashMap);
HashMap
es atravesado por Iterator.HashMap
es a prueba de fallos.HashMap
hereda la clase AbstractMap.Tabla de picadillo
Hashtable
está sincronizado Es seguro para subprocesos y se puede compartir con muchos subprocesos.Hashtable
no permite ninguna clave o valor nulo.Hashtable
Es una clase heredada.Hashtable
es lento.Hashtable
está sincronizado internamente y no se puede desincronizar.Hashtable
es atravesado por Enumerator e Iterator.Hashtable
no es a prueba de fallos.Hashtable
hereda la clase Diccionario.Lecturas adicionales ¿Cuál es la diferencia entre HashMap y Hashtable en Java?
fuente
Además de lo que izb dijo,
HashMap
permite valores nulos, mientrasHashtable
que no.También tenga en cuenta que
Hashtable
extiende laDictionary
clase, que como el estado de Javadocs , es obsoleta y ha sido reemplazada por laMap
interfaz.fuente
Echa un vistazo a este cuadro. Proporciona comparaciones entre diferentes estructuras de datos junto con
HashMap
yHashtable
. La comparación es precisa, clara y fácil de entender.Matriz de colección de Java
fuente
Hashtable
es similar alHashMap
y tiene una interfaz similar. Se recomienda que utiliceHashMap
, a menos que necesite soporte para aplicaciones heredadas o necesite sincronización, ya que losHashtables
métodos están sincronizados. Entonces, en su caso, ya que no es multihilo,HashMaps
es su mejor apuesta.fuente
Otra diferencia clave entre la tabla hash y el mapa hash es que Iterator en el HashMap es a prueba de fallas, mientras que el enumerador de la Hashtable no lo es y lanza ConcurrentModificationException si cualquier otro Thread modifica el mapa estructuralmente agregando o eliminando cualquier elemento, excepto el método remove () del Iterator. Pero este no es un comportamiento garantizado y JVM lo hará con el mejor esfuerzo ".
Mi fuente: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html
fuente
Además de todos los otros aspectos importantes ya mencionados aquí, la API de colecciones (por ejemplo, la interfaz de mapa) se está modificando todo el tiempo para cumplir con las "últimas y mejores" adiciones a las especificaciones de Java.
Por ejemplo, compare la iteración de Java 5 Map:
versus el viejo enfoque de Hashtable:
En Java 1.8 también se nos promete poder construir y acceder a HashMaps como en buenos y viejos lenguajes de scripting:
Actualización: No, no aterrizarán en 1.8 ... :(
¿Las mejoras de la colección de Project Coin estarán en JDK8?
fuente
Hashtable
está sincronizado, mientrasHashMap
que no lo está. Eso haceHashtable
más lento queHashmap
.Para las aplicaciones sin subprocesos, úselas
HashMap
ya que de lo contrario son las mismas en términos de funcionalidad.fuente
HashTable está sincronizado, si lo está usando en un solo hilo, puede usar HashMap , que es una versión no sincronizada. Los objetos no sincronizados son a menudo un poco más efectivos. Por cierto, si varios subprocesos acceden a un HashMap al mismo tiempo, y al menos uno de los subprocesos modifica el mapa estructuralmente, debe sincronizarse externamente. Youn puede envolver un mapa no sincronizado en uno sincronizado usando:
HashTable solo puede contener objetos no nulos como clave o como valor. HashMap puede contener una clave nula y valores nulos.
Los iteradores devueltos por Map son a prueba de fallas, si el mapa se modifica estructuralmente en cualquier momento después de que se crea el iterador, de cualquier manera, excepto a través del método remove del propio iterador, el iterador arrojará un
ConcurrentModificationException
. Por lo tanto, frente a la modificación concurrente, el iterador falla de manera rápida y limpia, en lugar de arriesgarse a un comportamiento arbitrario, no determinista en un momento indeterminado en el futuro. Mientras que las Enumeraciones devueltas por los métodos de elementos y claves de Hashtable no son a prueba de fallas.HashTable y HashMap son miembros de Java Collections Framework (desde la plataforma Java 2 v1.2, HashTable se actualizó para implementar la interfaz Map).
HashTable se considera código heredado, la documentación aconseja utilizar ConcurrentHashMap en lugar de Hashtable si se desea una implementación altamente concurrente segura para subprocesos.
HashMap no garantiza el orden en que se devuelven los elementos. Para HashTable, supongo que es lo mismo, pero no estoy completamente seguro, no encuentro recursos que lo indiquen claramente.
fuente
HashMap
yHashtable
tienen diferencias algorítmicas significativas también. Nadie ha mencionado esto antes, por eso lo menciono.HashMap
construirá una tabla hash con una potencia de dos tamaños, la aumentará dinámicamente de modo que tenga como máximo unos ocho elementos (colisiones) en cualquier cubo y agitará los elementos muy bien para los tipos de elementos generales. Sin embargo, laHashtable
implementación proporciona un control mejor y más fino sobre el hash si sabe lo que está haciendo, es decir, puede arreglar el tamaño de la tabla utilizando, por ejemplo, el número primo más cercano al tamaño de su dominio de valores y esto dará como resultado un mejor rendimiento que HashMap, es decir, menos colisiones para algunos casosAparte de las diferencias obvias discutidas extensamente en esta pregunta, veo el Hashtable como un automóvil de "manejo manual" donde tiene un mejor control sobre el hashing y el HashMap como el homólogo del "manejo automático" que generalmente funcionará bien.
fuente
Según la información aquí , recomendaría ir con HashMap. Creo que la mayor ventaja es que Java evitará que lo modifiques mientras lo iteras, a menos que lo hagas a través del iterador.
fuente
A
Collection
, a veces llamado contenedor, es simplemente un objeto que agrupa múltiples elementos en una sola unidad.Collection
s se utilizan para almacenar, recuperar, manipular y comunicar datos agregados. Un marco de colecciones W es una arquitectura unificada para representar y manipular colecciones.El
HashMap
JDK1.2
y HashtableJDK1.0
, ambos se usan para representar un grupo de objetos que están representados en<Key, Value>
pares. Cada<Key, Value>
par se llamaEntry
objeto. La colección de entradas se refiere por el objeto deHashMap
yHashtable
. Las claves de una colección deben ser únicas o distintivas. [ya que se utilizan para recuperar un valor mapeado de una clave particular. los valores en una colección se pueden duplicar.]« Miembro de Superclass, Legacy y Collection Framework
Hashtable es una clase heredada introducida en
JDK1.0
, que es una subclase de la clase Diccionario. DesdeJDK1.2
Hashtable se rediseñó para implementar la interfaz de Mapa para hacer un miembro del marco de recopilación. HashMap es miembro de Java Collection Framework desde el comienzo de su introducción enJDK1.2
. HashMap es la subclase de la clase AbstractMap.« Capacidad inicial y factor de carga
La capacidad es el número de cubos en la tabla hash, y la capacidad inicial es simplemente la capacidad en el momento en que se crea la tabla hash. Tenga en cuenta que la tabla hash está abierta: en el caso de un "
hash
collision
", un único depósito almacena múltiples entradas, que deben buscarse secuencialmente. El factor de carga es una medida de cuán llena se permite que llegue la tabla hash antes de que su capacidad aumente automáticamente.HashMap construye una tabla hash vacía con la capacidad inicial predeterminada (16) y el factor de carga predeterminado (0.75). Donde como Hashtable construye una tabla hash vacía con una capacidad inicial predeterminada (11) y un factor de carga / relación de llenado (0.75).
« Modificación estructural en caso de colisión de hash
HashMap
,Hashtable
en caso de colisiones hash, almacenan las entradas del mapa en listas vinculadas. Desde Java8 paraHashMap
si el depósito de hash crece más allá de cierto umbral, ese depósito cambiará delinked list of entries to a balanced tree
. que mejoran el rendimiento en el peor de los casos de O (n) a O (log n). Al convertir la lista a árbol binario, el código hash se usa como una variable de ramificación. Si hay dos códigos hash diferentes en el mismo cubo, uno se considera más grande y va a la derecha del árbol y el otro a la izquierda. Pero cuando ambos códigos hash son iguales,HashMap
supone que las claves son comparables y compara la clave para determinar la dirección para que se pueda mantener un cierto orden. Es una buena práctica convertir las claves deHashMap
una . Al agregar entradas si el tamaño del depósito alcanzaTREEIFY_THRESHOLD = 8
lista de entradas enlazadas convertibles comparables en un árbol equilibrado, al eliminar entradas de menos deTREEIFY_THRESHOLD
y como máximoUNTREEIFY_THRESHOLD = 6
, árbol equilibrado en una lista vinculada de entradas. Java 8 SRC , stackpost« Repetición de vista de colección, Fail-Fast y Fail-Safe
Iterator
es un fracaso en la naturaleza. es decir, arroja ConcurrentModificationException si se modifica una colección mientras se itera de otro modo que no sea su propio método remove (). Donde comoEnumeration
es a prueba de fallas en la naturaleza. No arroja ninguna excepción si una colección se modifica durante la iteración.De acuerdo con Java API Docs, Iterator siempre se prefiere sobre la enumeración.
NOTA: La funcionalidad de la interfaz Enumeration está duplicada por la interfaz Iterator. Además, Iterator agrega una operación de eliminación opcional y tiene nombres de método más cortos. Las nuevas implementaciones deberían considerar usar Iterator en lugar de Enumeration.
En Java 5, se introdujo la interfaz ConcurrentMap :
ConcurrentHashMap
unaConcurrentMap
implementación altamente concurrente de alto rendimiento respaldada por una tabla hash. Esta implementación nunca se bloquea al realizar recuperaciones y permite al cliente seleccionar el nivel de concurrencia para las actualizaciones. Está pensado como un reemplazo directo paraHashtable
: además de implementarConcurrentMap
, es compatible con todos los métodos "heredados" propios deHashtable
.HashMapEntry
El valor de cada s es volátil, lo que garantiza una consistencia de grano fino para modificaciones contenidas y lecturas posteriores; cada lectura refleja la actualización completada más recientementeLos iteradores y las enumeraciones son a prueba de fallos, lo que refleja el estado en algún momento desde la creación del iterador / enumeración; Esto permite lecturas y modificaciones simultáneas a costa de una consistencia reducida. No lanzan ConcurrentModificationException. Sin embargo, los iteradores están diseñados para ser utilizados por un solo hilo a la vez.
Me gusta
Hashtable
peroHashMap
no me gusta , esta clase no permite que se use nulo como clave o valor.«« Claves nulas y valores nulos
HashMap
permite un máximo de una clave nula y cualquier número de valores nulos. Donde asHashtable
no permite ni siquiera una sola clave nula y un valor nulo, si la clave o el valor nulo es entonces arroja NullPointerException.Ejemplo«« Sincronizado, hilo seguro
Hashtable
está sincronizado internamente Por lo tanto, es muy seguro de usarHashtable
en aplicaciones de subprocesos múltiples. Donde comoHashMap
no está sincronizado internamente. Por lo tanto, no es seguro usarloHashMap
en aplicaciones de subprocesos múltiples sin sincronización externa. Puedes sincronizar externamenteHashMap
utilizando elCollections.synchronizedMap()
método«« Rendimiento
Como
Hashtable
está sincronizado internamente, esto hace que sea unHashtable
poco más lento que elHashMap
.@Ver
HashMap
en Java 8fuente
Para las aplicaciones de subprocesos, a menudo puede salirse con la suya ConcurrentHashMap, depende de sus requisitos de rendimiento.
fuente
1.
Hashmap
yHashTable
ambos almacenan clave y valor.2.
Hashmap
puede almacenar una clave comonull
.Hashtable
no puede almacenarnull
.3.
HashMap
no está sincronizado peroHashtable
está sincronizado.4.
HashMap
se puede sincronizar conCollection.SyncronizedMap(map)
fuente
Además de las diferencias ya mencionadas, debe tenerse en cuenta que desde Java 8,
HashMap
reemplaza dinámicamente los nodos (lista vinculada) utilizados en cada cubo con TreeNodes (árbol rojo-negro), de modo que incluso si existen colisiones de hash altas, el peor de los casos cuando buscando esO (log (n)) para
HashMap
Vs O (n) enHashtable
.* La mejora antes mencionada no se ha aplicado a
Hashtable
todavía, pero sólo aHashMap
,LinkedHashMap
yConcurrentHashMap
.FYI, actualmente,
TREEIFY_THRESHOLD = 8
: si un depósito contiene más de 8 nodos, la lista vinculada se transforma en un árbol equilibrado.UNTREEIFY_THRESHOLD = 6
: cuando un depósito se vuelve demasiado pequeño (debido a la eliminación o al cambio de tamaño), el árbol se convierte nuevamente en una lista vinculada.fuente
Hay 5 diferenciaciones básicas con HashTable y HashMaps.
fuente
Mi pequeña contribución:
fuente
HashMap: es una clase disponible dentro del paquete java.util y se usa para almacenar el elemento en formato de clave y valor.
Hashtable: es una clase heredada que se reconoce dentro del marco de recopilación.
fuente
HashTable es una clase heredada en el jdk que ya no debería usarse. Reemplace sus usos con ConcurrentHashMap . Si no necesita seguridad para subprocesos, use HashMap, que no es seguro para subprocesos pero es más rápido y usa menos memoria.
fuente
Hashtable
está sincronizado mientras queHashMap
que no lo está.HashMap
es a prueba de fallas mientras que el enumerador para elHashtable
no lo es. Si cambia el mapa mientras itera, lo sabrá.HashMap
permite valores nulos en él, mientras queHashtable
que no.fuente
HashMap y HashTable
1) Hashtable y Hashmap implementan la interfaz java.util.Map 2) Tanto Hashmap como Hashtable es la colección basada en hash. y trabajando en hashing. Estas son similitudes de HashMap y HashTable.
1) La primera diferencia es que HashMap no es seguro para subprocesos, mientras que HashTable es ThreadSafe
2) HashMap es mejor en cuanto a rendimiento porque no es seguro para subprocesos. mientras que el rendimiento de Hashtable no es mejor porque es seguro para subprocesos. por lo que varios subprocesos no pueden acceder a Hashtable al mismo tiempo.
fuente
Hashtable:
Hashtable es una estructura de datos que retiene los valores del par clave-valor. No permite nulo tanto para las claves como para los valores. Obtendrá un
NullPointerException
si agrega valor nulo. Está sincronizado Entonces viene con su costo. Solo un hilo puede acceder a HashTable en un momento particular.Ejemplo :
HashMap:
HashMap es como Hashtable pero también acepta pares de valores clave. Permite nulo tanto para las claves como para los valores. Su rendimiento mejor es mejor que
HashTable
, porque esunsynchronized
.Ejemplo:
fuente
HashMap
se emula y, por lo tanto, se puede usarGWT client code
mientrasHashtable
que no.fuente
Tema antiguo y clásico, solo quiero agregar este útil blog que explica esto:
http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/
Blog de Manish Chhabra
fuente
HashMap y Hashtable se usan para almacenar datos en forma de clave y valor. Ambos utilizan la técnica de hashing para almacenar claves únicas. Sin embargo, hay muchas diferencias entre las clases HashMap y Hashtable que se dan a continuación.
fuente