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

Resuelto dmanxiii asked hace 16 años • 35 respuestas

¿ Cuáles son las diferencias entre a HashMapy a Hashtableen Java?

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

dmanxiii avatar Sep 03 '08 03:09 dmanxiii
Aceptado

Hay varias diferencias entre HashMapy Hashtableen Java:

  1. Hashtableestá sincronizado , mientras que HashMapno lo está. Esto es HashMapmejor para las aplicaciones sin subprocesos, ya que los objetos no sincronizados suelen funcionar mejor que los sincronizados.

  2. Hashtableno permite nullclaves ni valores. HashMappermite una nullclave y cualquier número de nullvalores.

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

Dado que la sincronización no es un problema para usted, le recomiendo HashMap. Si la sincronización se convierte en un problema, también puedes consultar ConcurrentHashMap.

Josh Brown avatar Sep 02 '2008 23:09 Josh Brown

Tenga en cuenta que muchas de las respuestas indican que Hashtable está sincronizado. En la práctica, esto te permite comprar muy poco. La sincronización está en los métodos de acceso/mutador y detendrá la adición o eliminación de dos subprocesos 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 colocar", es decir, buscar una entrada en el archivo Mapy agregarla si aún no existe. Esta no es de ninguna manera una operación atómica ya sea que use Hashtableo HashMap.

HashMapSe puede obtener un sincronizado equivalente mediante:

Collections.synchronizedMap(myMap);

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

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

Incluso iterar sobre las Hashtableentradas de a (u HashMapobtenidas por Collections.synchronizedMap) no es seguro para subprocesos a menos que también proteja las Mapentradas para que no se modifiquen mediante sincronización adicional.

Las implementaciones de la ConcurrentMapinterfaz (por ejemplo ConcurrentHashMap) resuelven parte de esto al incluir una semántica de verificación y acción segura para subprocesos, como por ejemplo:

ConcurrentMap.putIfAbsent(key, value);
serg10 avatar Sep 03 '2008 11:09 serg10

Hashtablese considera código heredado. No hay nada Hashtableque no se pueda hacer usando HashMapo derivaciones de HashMap, por lo que para el código nuevo, no veo ninguna justificación para volver a Hashtable.

aberrant80 avatar Jun 25 '2009 01:06 aberrant80