HashMap vs Hashtable en Java: diferencias y funcionamiento interno

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

HashMap vs Hashtable en Java: ¿quién gana? Analizando bajo el capó

\n\n

Si alguna vez te has preguntado: «¿Cuál es realmente la diferencia entre HashMap y Hashtable?» — no estás solo. Es una de las preguntas más populares en Stack Overflow, y con razón. Ambas clases almacenan datos en formato «clave — valor», ambas usan hashing, pero viven en mundos diferentes. Una es rápida y moderna, la otra es vieja, confiable, pero un poco torpe. Vamos a mirar «bajo el capó» y entender de qué se trata.

\n\n

En este artículo no solo enumeraremos las diferencias. Entenderemos cómo funciona la mecánica interna, por qué una clase permite null y la otra no, y cuándo usar ConcurrentHashMap en lugar de ambas.

\n\n

Breve paseo por la historia

\n\n

Hashtable apareció en Java ya en la versión 1.0. Fue una de las primeras clases de colecciones y desde el principio fue sincronizada. En aquellos tiempos, la concurrencia era rara, pero los desarrolladores de Java decidieron ir sobre seguro. Más tarde, en Java 2 (1.2), surgieron nuevas colecciones del framework Collections Framework, y entre ellas — HashMap. No estaba sincronizada, pero era mucho más rápida. Desde entonces, Hashtable se considera obsoleta (legacy), aunque nadie la ha eliminado del lenguaje.

\n\n

Diferencia principal: sincronización y hilos

\n\n

La primera y más importante diferencia es la sincronización. Los métodos de Hashtable (por ejemplo, put(), get(), remove()) están marcados con la palabra clave synchronized. Esto significa que dos hilos no pueden ejecutar simultáneamente el mismo método en un mismo objeto Hashtable. Suena como una ventaja, pero en la práctica se convierte en un cuello de botella.

\n\n
// Hashtable — todos los métodos están sincronizados\nHashtable<String, String> table = new Hashtable<>();\ntable.put("key1", "value1"); // seguro para hilos, pero lento con alta contención\n\n// HashMap — no está sincronizado\nHashMap<String, String> map = new HashMap<>();\nmap.put("key1", "value1"); // rápido, pero no seguro para hilos\n
\n\n

Si trabajas en una aplicación de un solo hilo (que son la mayoría), HashMap será más rápido porque no necesita perder tiempo adquiriendo y liberando bloqueos. Si necesitas seguridad para hilos, es mejor no usar Hashtable, sino optar por ConcurrentHashMap (apareció en Java 5). Este utiliza un bloqueo más fino (segmentos o bloqueos a nivel de cubos) y funciona significativamente más rápido en entornos multihilo.

\n\n

Null, null y más null

\n\n

La segunda diferencia importante es el manejo de null. HashMap permite usar null tanto como clave (exactamente una vez) como valor (tantas veces como se quiera). Hashtable, en cambio, lanzará una NullPointerException si intentas pasar null.

\n\n
HashMap<String, String> map = new HashMap<>();\nmap.put(null, "nullKey"); // OK\nmap.put("key", null);     // OK\nSystem.out.println(map.get(null)); // "nullKey"\n\nHashtable<String, String> table = new Hashtable<>();\n// table.put(null, "value"); // NullPointerException!\n// table.put("key", null);   // NullPointerException!\n
\n\n

¿Por qué sucede esto? Todo se debe a cómo funciona el hashing. En HashMap, para la clave null se usa un código hash especial 0, y se coloca en el cubo (bucket) cero. Hashtable, en cambio, utiliza un mecanismo antiguo donde llamar a hashCode() sobre null provoca un error. Además, Hashtable no está diseñado para valores null, ya que esto rompería la lógica de las operaciones sincronizadas.

\n\n

Funcionamiento interno: cómo funciona la tabla hash bajo el capó

\n\n

Para entender la diferencia más a fondo, echemos un vistazo al interior. Tanto HashMap como Hashtable se basan en una tabla hash. Se trata de un array de «cubos», donde cada cubo es una lista enlazada (o un árbol, a partir de Java 8). Cuando agregas un

Blogs

Book Recommendations