¿Cuáles son las diferencias entre un HashMap y un Hashtable en Java?
¿ Cuáles son las diferencias entre a HashMap
y a Hashtable
en Java?
¿Cuál es más eficiente para aplicaciones sin subprocesos?
Hay varias diferencias entre HashMap
y Hashtable
en Java:
Hashtable
está sincronizado , mientras queHashMap
no lo está. Esto esHashMap
mejor para las aplicaciones sin subprocesos, ya que los objetos no sincronizados suelen funcionar mejor que los sincronizados.Hashtable
no permitenull
claves ni valores.HashMap
permite unanull
clave y cualquier número denull
valores.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 archivoHashMap
por un archivoLinkedHashMap
. Esto no sería tan fácil si estuvieras usandoHashtable
.
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
.
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 Map
y agregarla si aún no existe. Esta no es de ninguna manera una operación atómica ya sea que use Hashtable
o HashMap
.
HashMap
Se 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 Hashtable
entradas de a (u HashMap
obtenidas por Collections.synchronizedMap
) no es seguro para subprocesos a menos que también proteja las Map
entradas para que no se modifiquen mediante sincronización adicional.
Las implementaciones de la ConcurrentMap
interfaz (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);
Hashtable
se considera código heredado. No hay nada Hashtable
que no se pueda hacer usando HashMap
o derivaciones de HashMap
, por lo que para el código nuevo, no veo ninguna justificación para volver a Hashtable
.