java objetos Diferencias entre HashMap y Hashtable?




metodos de hashmap java (24)

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

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


Hashtable está sincronizado, mientras que HashMap no lo está. Eso hace que Hashtable sea más lento que Hashmap.

Para aplicaciones sin subprocesos, use HashMap ya que, por lo demás, son los mismos en términos de funcionalidad.


Hay muchas buenas respuestas ya publicadas. Estoy agregando algunos puntos nuevos y resumiéndolos.

HashMap y Hashtable se utilizan para almacenar datos en forma de clave y valor . Ambos están utilizando la técnica de hash para almacenar claves únicas. Pero hay muchas diferencias entre las clases HashMap y Hashtable que se dan a continuación.

HashMap

  1. HashMap no está sincronizado. No es seguro para subprocesos y no se puede compartir entre muchos subprocesos sin el código de sincronización adecuado.
  2. HashMap permite una clave nula y varios valores nulos.
  3. HashMap es una nueva clase introducida en JDK 1.2.
  4. HashMap es rápido.
  5. Podemos hacer el HashMap como sincronizado llamando a este código
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap es atravesado por Iterator.
  7. Iterador en HashMap es rápido de fallas.
  8. HashMap hereda la clase AbstractMap.

Tabla de picadillo

  1. Hashtable está sincronizado. Es seguro para subprocesos y se puede compartir con muchos subprocesos.
  2. Hashtable no permite ninguna clave o valor nulo.
  3. Hashtable es una clase heredada.
  4. Hashtable es lento.
  5. Hashtable está sincronizado internamente y no puede ser desincronizado.
  6. Hashtable es atravesado por Enumerator e Iterator.
  7. El enumerador en Hashtable no es rápido.
  8. Hashtable hereda clase de diccionario.

Lectura adicional ¿Cuál es la diferencia entre HashMap y Hashtable en Java?


Echa un vistazo a este gráfico. 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 colección de Java


HashTable es una clase heredada en el jdk que ya no debería usarse. Reemplace los usos de la misma con ConcurrentHashMap . Si no necesita seguridad de subprocesos, use HashMap que no es threadsafe pero es más rápido y usa menos memoria.


Hashtable:

Hashtable es una estructura de datos que conserva los valores del par clave-valor. No permite nulo tanto para las claves como para los valores. Obtendrá un NullPointerExceptionvalor nulo si agrega. Está sincronizado. Así que viene con su costo. Sólo un hilo puede acceder a HashTable en un momento determinado.

Ejemplo :

import java.util.Map;
import java.util.Hashtable;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states= new Hashtable<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    //will throw NullPointerEcxeption at runtime

    System.out.println(states.get(1));
    System.out.println(states.get(2));
//  System.out.println(states.get(3));

    }
}

HashMap:

HashMap es como Hashtable pero también acepta un par de valores clave. Permite nulo tanto para las claves como para los valores. Su rendimiento mejor es mejor que HashTable, porque lo es unsynchronized.

Ejemplo:

import java.util.HashMap;
import java.util.Map;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states = new HashMap<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    // Okay
    states.put(null,"UK");

    System.out.println(states.get(1));
    System.out.println(states.get(2));
    System.out.println(states.get(3));

    }
}

HashMapEs emulado y por lo tanto utilizable en el GWT client codeque Hashtableno lo es.


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 en los métodos de acceso / mutador detendrá dos subprocesos que se agregan o eliminan del mapa al mismo tiempo, pero en el mundo real a menudo necesitará una sincronización adicional.

Un modismo muy común es "verificar y luego poner", es decir, buscar una entrada en el Mapa y agregarla si no existe. Esto no es en modo alguno una operación atómica, ya sea que utilice Hashtable o HashMap.

Se puede obtener un HashMap sincronizado de manera equivalente mediante:

Collections.synchronizedMap(myMap);

Pero para implementar correctamente esta lógica necesitas una sincronización adicional del formulario:

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

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

Las implementaciones de la interfaz de ConcurrentMap (por ejemplo, ConcurrentHashMap ) resuelven algo de esto al incluir semánticas seguras de subprocesos que se activan y ejecutan , como:

ConcurrentMap.putIfAbsent(key, value);

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

También tenga en cuenta que Hashtable extiende la clase de Dictionary , que, como el estado de Javadocs , está obsoleta y ha sido reemplazada por la interfaz de Map .


Mi pequeña contribución:

  1. Primero y más importante entre diferentes Hashtabley HashMapes que, HashMapno es seguro para subprocesos, mientras que Hashtablees una colección segura para subprocesos.

  2. La segunda diferencia importante entre Hashtabley HashMapes el rendimiento, ya HashMapque no está sincronizado, funciona mejor que Hashtable.

  3. La tercera diferencia en Hashtablevs HashMapes que Hashtablees una clase obsoleta y que deberías usar ConcurrentHashMapen lugar de Hashtableen Java.


  • HashTable está sincronizado, si lo está utilizando en un solo hilo, puede usar docs.oracle.com/javase/7/docs/api/java/util/HashMap.html , que es una versión no sincronizada. Los objetos no sincronizados suelen tener un poco más de rendimiento. Por cierto, si varios subprocesos acceden a un HashMap simultáneamente, 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:

    Map m = Collections.synchronizedMap(new HashMap(...));
    
  • HashTable solo puede contener un objeto no nulo como clave o como valor. HashMap puede contener una clave nula y valores nulos.

  • Los iteradores devueltos por Map son rápidos, si el mapa se modifica estructuralmente en cualquier momento después de que se crea el iterador, de cualquier forma, excepto a través del propio método de eliminación del iterador, el iterador emitirá una excepción ConcurrentModificationException . Por lo tanto, ante una modificación concurrente, el iterador falla de manera rápida y limpia, en lugar de arriesgarse a comportamientos arbitrarios y no deterministas 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 modificó para implementar la interfaz de Map).

  • HashTable se considera un código heredado, la documentación recomienda 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, creo que es lo mismo, pero no estoy del todo seguro, no encuentro un recurso que lo indique claramente.


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

  1. La clase HashMap es aproximadamente equivalente a Hashtable, excepto que no está sincronizada y permite 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 se mantendrá constante en el tiempo.
  3. HashMap no está sincronizado, mientras que Hashtable está sincronizado.
  4. El iterador en el HashMap es a prueba de fallos, mientras que el enumerador para el Hashtable no lo es y lanza la excepción ConcurrentModificationException si cualquier otro hilo modifica el mapa estructuralmente agregando o eliminando cualquier elemento, excepto el propio método remove () del iterador. Pero esto 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 momento determinado. Básicamente, significa que cualquier subproceso 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 hilo intenta modificar el objeto de colección "estructuralmente", se lanzará una excepción de modificación concurrente. Sin embargo, es posible que otros subprocesos invocen el método "set" ya que no modifica la colección "estructuralmente". Sin embargo, si antes de llamar "set", la colección se modificó estructuralmente, se lanzará "IllegalArgumentException".
  3. La modificación estructural significa eliminar o insertar un elemento que podría cambiar efectivamente la estructura del mapa.

HashMap puede ser sincronizado 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 en gran medida la expresividad de la interfaz, como se explica 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 de eliminar entradas en medio de la iteración; Hashtable no lo hizo. Finalmente, Map corrige una deficiencia menor en la interfaz Hashtable. Hashtable tiene un método llamado contiene, que devuelve verdadero si la tabla tiene un valor determinado. Dado su nombre, esperaría que este método devuelva verdadero si el Hashtable contuviera una clave dada, porque la clave es el mecanismo de acceso principal para un Hashtable. La interfaz del Mapa elimina esta fuente de confusión al cambiar el nombre del método que contieneValor. Además, esto mejora la consistencia de la interfaz: contiene valores paralelos aViene de clave.

La interfaz del mapa


1. Hashmap y HashTable almacenan clave y valor.

2. Hashmap puede almacenar una clave como null . Hashtable no puede almacenar null .

3. HashMap no está sincronizado pero Hashtable está sincronizado.

4. HashMap se puede sincronizar con Collection.SyncronizedMap(map)

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);

Hashtable es similar al HashMap y tiene una interfaz similar. Se recomienda que utilice HashMap , a menos que necesite soporte para aplicaciones heredadas o que necesite sincronización, ya que los métodos de Hashtables están sincronizados. Así que en tu caso, ya que no eres multihilo, HashMaps es tu mejor apuesta.


Sincronización o hilo seguro :

Hash Map no está sincronizado, por lo tanto, no es seguro y no puede compartirse entre varios subprocesos sin el bloque sincronizado adecuado, mientras que Hashtable está sincronizado y, por lo tanto, es seguro para subprocesos.

Claves nulas y valores nulos :

HashMap permite una clave nula y cualquier número de valores nulos. Hashtable no permite claves o valores nulos.

Iterando los valores :

Iterator en HashMap es un iterador rápido de fallas, mientras que el enumerador para Hashtable no lo es y lanza ConcurrentModificationException si cualquier otro Thread modifica el mapa estructuralmente agregando o eliminando cualquier elemento, excepto el propio método remove () de Iterator.

Superclase y Legado :

HashMap es una subclase de la clase AbstractMap, mientras que Hashtable es una subclase de la clase Dictionary.

Rendimiento :

Como HashMap no está sincronizado, es más rápido en comparación con Hashtable.

Consulte http://modernpathshala.com/Article/1020/difference-between-hashmap-and-hashtable-in-java para ver ejemplos y preguntas de entrevistas y cuestionarios relacionados con la colección de Java


Además de todos los otros aspectos importantes que ya se mencionaron aquí, la API de colecciones (por ejemplo, la interfaz del mapa) se está modificando todo el tiempo para cumplir con las "últimas y mejores" incorporaciones a las especificaciones de Java.

Por ejemplo, compare la iteración del mapa Java 5:

for (Elem elem : map.keys()) {
  elem.doSth();
}

versus el antiguo enfoque Hashtable:

for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
  Elem elem = (Elem) en.nextElement();
  elem.doSth();
}

En Java 1.8 también se nos promete poder construir y acceder a HashMaps como en los viejos lenguajes de scripting:

Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];

Actualización: No, no aterrizarán en 1.8 ... :(

¿Las mejoras de la colección de Project Coin estarán en JDK8?


Tenga en cuenta que HashTable era una clase heredada antes de que se introdujera Java Collections Framework (JCF) y luego se modificó para implementar la interfaz de Map . Así fue Vector y Stack .

Por lo tanto, siempre manténgase alejado de ellos en el nuevo código, ya que siempre hay una mejor alternativa en la JCF, como han señalado otros.

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


Basado en la información here , recomiendo ir con HashMap. Creo que la mayor ventaja es que Java evitará que lo modifiques mientras estés iterando sobre él, a menos que lo hagas a través del iterador.


HashMap y Hashtable tienen diferencias algorítmicas significativas. 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 manera que tenga como máximo ocho elementos (colisiones) en cualquier cubo y agitará los elementos muy bien para los tipos de elementos generales. Sin embargo, la implementación de Hashtable proporciona un control mejor y más preciso sobre el hash si sabe lo que está haciendo, es decir, puede corregir 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 casos.

Aparte de las diferencias obvias discutidas ampliamente en esta pregunta, veo el Hashtable como un auto de "manejo manual" en el que tienes mejor control sobre el hash y al HashMap como la contraparte del "auto drive" que generalmente funcionará bien.


Además de las diferencias ya mencionadas, se debe tener en cuenta que, dado que Java 8, HashMap reemplaza dinámicamente los Nodos (lista enlazada) utilizados en cada grupo con TreeNodes (árbol rojo-negro), de modo que incluso si existen colisiones de hash altas, el peor caso cuando la búsqueda es

O (log (n)) para HashMap Vs O (n) en Hashtable .

* La mejora antes mencionada aún no se ha aplicado a Hashtable , pero solo a HashMap , LinkedHashMap y ConcurrentHashMap .

Para tu información, actualmente,

  • TREEIFY_THRESHOLD = 8 : si un grupo contiene más de 8 nodos, la lista enlazada se transforma en un árbol equilibrado.
  • UNTREEIFY_THRESHOLD = 6 : cuando un grupo se vuelve demasiado pequeño (debido a la eliminación o al cambio de tamaño), el árbol se convierte de nuevo a la lista vinculada.

Hay 5 diferenciaciones básicas con HashTable y HashMaps.

  1. Maps le permite iterar y recuperar claves, valores y ambos pares clave-valor también, donde la tabla hash no tiene toda esta capacidad.
  2. En Hashtable hay una función contiene (), que es muy confuso de usar. Debido a que el significado de contiene es ligeramente divergente. ¿Significa si contiene clave o contiene valor? difícil de entender Lo mismo en los mapas, tenemos las funciones ContainsKey () y ContainsValue (), que son muy fáciles de entender.
  3. En hashmap puedes eliminar el elemento mientras lo haces, de forma segura. Donde como no es posible en tablas hash.
  4. Las tablas hash están sincronizadas de forma predeterminada, por lo que se pueden usar con varios subprocesos fácilmente. Donde los HashMaps no están sincronizados de forma predeterminada, por lo tanto, se pueden usar con un solo hilo. Pero aún puede convertir HashMap a sincronizado usando la función synchronizedMap (Map m) de la clase util util Collections.
  5. HashTable no permitirá claves nulas o valores nulos. Where como HashMap permite una clave nula y varios valores nulos.

1) Hashtable está sincronizado mientras que hashmap no lo está. 2) Otra diferencia es que el iterador en el HashMap es a prueba de fallas, mientras que el enumerador para el Hashtable no lo es. Si cambias el mapa mientras lo haces, lo sabrás.

3) HashMap permite valores nulos en él, mientras que Hashtable no lo hace.


Hay varias diferencias entre HashMap y Hashtable en Java:

  1. Hashtable está synchronized , mientras que HashMap no lo está. Esto hace que HashMap sea ​​mejor para aplicaciones sin subprocesos, ya que los Objetos no sincronizados normalmente tienen un mejor desempeño que los sincronizados.

  2. Hashtable no permite claves o valores null . HashMap permite una clave null y cualquier número de valores null .

  3. 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 de forma predeterminada), puede cambiar fácilmente el HashMap por un LinkedHashMap . Esto no sería tan fácil si estuvieras usando Hashtable .

Dado que la sincronización no es un problema para usted, recomendaría HashMap . Si la sincronización se convierte en un problema, también puede consultar ConcurrentHashMap .


HashMap y HashTable

  • Algunos puntos importantes sobre HashMap y HashTable. por favor lea los detalles a continuación.

1) Hashtable y Hashmap implementan la interfaz java.util.Map 2) Tanto Hashmap como Hashtable son la colección basada en hash. y trabajando en hash. por lo que estos son la similitud de HashMap y HashTable.

  • ¿Cuál es la diferencia entre HashMap y HashTable?

1) La primera diferencia es que HashMap no es seguro para subprocesos, mientras que HashTable es ThreadSafe
2) HashMap tiene un mejor rendimiento porque no es seguro para subprocesos mientras que el rendimiento de Hashtable no es mejor porque es seguro para subprocesos. por lo que múltiples hilos no pueden acceder a Hashtable al mismo tiempo.


HashMaps le da libertad de sincronización y depuración es mucho más fácil





hashtable