¿Cuáles son las diferencias entre a HashMapy a Hashtableen Java?
¿Cuál es más eficiente para aplicaciones sin rosca?
java
collections
hashmap
hashtable
dmanxiii
fuente
fuente

ConcurrentMapes 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
HashMapyHashtableen Java:Hashtableestá sincronizado , mientrasHashMapque no lo está. EstoHashMapmejora las aplicaciones sin subprocesos, ya que los objetos no sincronizados suelen funcionar mejor que los sincronizados.Hashtableno permitenullclaves o valores.HashMappermite unanullclave y cualquier cantidad denullvalores.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 elHashMappor 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 unaConcurrentMapimplementación (y explotar su API extendida para la concurrencia). En pocas palabras: la única razón para usarHashtablees 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 useHashtableoHashMap.Se
HashMappuede obtener una sincronización equivalente mediante:Pero para implementar correctamente esta lógica, necesita sincronización adicional del formulario:
Incluso iterar sobre
Hashtablelas entradas de un (o unHashMapobtenido porCollections.synchronizedMap) no es seguro para subprocesos a menos que también evite queMapse modifique mediante una sincronización adicional.Las implementaciones de la
ConcurrentMapinterfaz (por ejemploConcurrentHashMap) resuelven algo de esto mediante la inclusión de semánticas seguras para comprobar y luego actuar como:fuente
Hashtablese considera código heredado. No hay nada de esoHashtableque no se pueda hacer usandoHashMapo 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.
HashMapclase es más o menos equivalente aHashtable, excepto que no está sincronizada y permite valores nulos. (HashMappermite valores nulos como clave y valor, mientrasHashtableque no permitenulls).HashMapno garantiza que el orden del mapa se mantendrá constante en el tiempo.HashMapno está sincronizado mientras queHashtableestá sincronizado.HashMapes a prueba de fallas, mientras que el enumerador para elHashtableno lo es y arrojaConcurrentModificationExceptionsi cualquier otro hilo modifica estructuralmente el mapa agregando o eliminando cualquier elemento, exceptoIteratorel propioremove()método. Pero este no es un comportamiento garantizado y JVM lo hará con el mejor esfuerzo.Nota sobre algunos términos importantes:
Hashtabletendrá que adquirir un bloqueo en el objeto, mientras que otros esperarán a que se libere el bloqueo.setmétodo ya que no modifica la colección "estructuralmente". Sin embargo, si antes de llamarset, la colección se ha modificado estructuralmente,IllegalArgumentExceptionserá arrojada.HashMappuede 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;
HashtableNo proporciona la tercera opción. El mapa proporciona una forma segura de eliminar entradas en medio de la iteración;HashtableNo. Finalmente, Map corrige una deficiencia menor en laHashtableinterfaz.Hashtabletiene un método llamado contiene, que devuelve verdadero siHashtablecontiene un valor dado. Dado su nombre, esperaría que este método devuelva verdadero siHashtablecontuviera 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étodocontainsValuecontainsValuecontainsKey.fuente
setoperación en aHashMap. 3) Laput(...)operación no se lanzaráIllegalArgumentExceptionsi hubo un cambio previo. 4) El comportamiento de falla rápidaHashMaptambié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 unHashTablesi realiza una modificación concurrente. El comportamiento real es ... impredecible)Hashtabletampoco garantiza que el orden de los elementos del mapa sea estable en el tiempo. (Quizás te estés confundiendoHashtableconLinkedHashMap.)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 laMapinterfaz 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
Hashtabletodo. 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 usarConcurrentHashMapen su lugar.fuente
Tenga en cuenta que
HashTableera una clase heredada antes de que se introdujera Java Collections Framework (JCF) y que luego se modificó para implementar laMapinterfaz. Así fueVectoryStack.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.
HashMapyHashtableambos 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
HashMapno está sincronizado No es seguro para subprocesos y no se puede compartir entre muchos subprocesos sin un código de sincronización adecuado.HashMappermite una clave nula y múltiples valores nulos.HashMapes una nueva clase introducida en JDK 1.2.HashMapes rápido.HashMapsincronizarlo llamando a este códigoMap m = Collections.synchronizedMap(HashMap);HashMapes atravesado por Iterator.HashMapes a prueba de fallos.HashMaphereda la clase AbstractMap.Tabla de picadillo
Hashtableestá sincronizado Es seguro para subprocesos y se puede compartir con muchos subprocesos.Hashtableno permite ninguna clave o valor nulo.HashtableEs una clase heredada.Hashtablees lento.Hashtableestá sincronizado internamente y no se puede desincronizar.Hashtablees atravesado por Enumerator e Iterator.Hashtableno es a prueba de fallos.Hashtablehereda la clase Diccionario.Lecturas adicionales ¿Cuál es la diferencia entre HashMap y Hashtable en Java?
fuente
Además de lo que izb dijo,
HashMappermite valores nulos, mientrasHashtableque no.También tenga en cuenta que
Hashtableextiende laDictionaryclase, que como el estado de Javadocs , es obsoleta y ha sido reemplazada por laMapinterfaz.fuente
Echa un vistazo a este cuadro. Proporciona comparaciones entre diferentes estructuras de datos junto con
HashMapyHashtable. La comparación es precisa, clara y fácil de entender.Matriz de colección de Java
fuente
Hashtablees similar alHashMapy tiene una interfaz similar. Se recomienda que utiliceHashMap, a menos que necesite soporte para aplicaciones heredadas o necesite sincronización, ya que losHashtablesmétodos están sincronizados. Entonces, en su caso, ya que no es multihilo,HashMapses 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
Hashtableestá sincronizado, mientrasHashMapque no lo está. Eso haceHashtablemás lento queHashmap.Para las aplicaciones sin subprocesos, úselas
HashMapya 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
HashMapyHashtabletienen diferencias algorítmicas significativas también. Nadie ha mencionado esto antes, por eso lo menciono.HashMapconstruirá 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, laHashtableimplementació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.Collections 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
HashMapJDK1.2y HashtableJDK1.0, ambos se usan para representar un grupo de objetos que están representados en<Key, Value>pares. Cada<Key, Value>par se llamaEntryobjeto. La colección de entradas se refiere por el objeto deHashMapyHashtable. 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.2Hashtable 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 "
hashcollision", 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,Hashtableen caso de colisiones hash, almacenan las entradas del mapa en listas vinculadas. Desde Java8 paraHashMapsi 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,HashMapsupone 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 deHashMapuna . Al agregar entradas si el tamaño del depósito alcanzaTREEIFY_THRESHOLD = 8lista de entradas enlazadas convertibles comparables en un árbol equilibrado, al eliminar entradas de menos deTREEIFY_THRESHOLDy 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
Iteratores 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 comoEnumerationes 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 :
ConcurrentHashMapunaConcurrentMapimplementació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.HashMapEntryEl 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
HashtableperoHashMapno me gusta , esta clase no permite que se use nulo como clave o valor.«« Claves nulas y valores nulos
HashMappermite un máximo de una clave nula y cualquier número de valores nulos. Donde asHashtableno 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
Hashtableestá sincronizado internamente Por lo tanto, es muy seguro de usarHashtableen aplicaciones de subprocesos múltiples. Donde comoHashMapno está sincronizado internamente. Por lo tanto, no es seguro usarloHashMapen aplicaciones de subprocesos múltiples sin sincronización externa. Puedes sincronizar externamenteHashMaputilizando elCollections.synchronizedMap()método«« Rendimiento
Como
Hashtableestá sincronizado internamente, esto hace que sea unHashtablepoco más lento que elHashMap.@Ver
HashMapen Java 8fuente
Para las aplicaciones de subprocesos, a menudo puede salirse con la suya ConcurrentHashMap, depende de sus requisitos de rendimiento.
fuente
1.
HashmapyHashTableambos almacenan clave y valor.2.
Hashmappuede almacenar una clave comonull.Hashtableno puede almacenarnull.3.
HashMapno está sincronizado peroHashtableestá sincronizado.4.
HashMapse puede sincronizar conCollection.SyncronizedMap(map)fuente
Además de las diferencias ya mencionadas, debe tenerse en cuenta que desde Java 8,
HashMapreemplaza 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
HashMapVs O (n) enHashtable.* La mejora antes mencionada no se ha aplicado a
Hashtabletodavía, pero sólo aHashMap,LinkedHashMapyConcurrentHashMap.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
Hashtableestá sincronizado mientras queHashMapque no lo está.HashMapes a prueba de fallas mientras que el enumerador para elHashtableno lo es. Si cambia el mapa mientras itera, lo sabrá.HashMappermite valores nulos en él, mientras queHashtableque 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
NullPointerExceptionsi 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
HashMapse emula y, por lo tanto, se puede usarGWT client codemientrasHashtableque 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