HashMap, HashSet y Hashtable en Java
La interfaz Collections
de Java nos proporciona varias interfaces y clases para implementar una variedad de estructuras de datos y algoritmos.
Este tutorial discutirá HashMap
, HashSet
y Hashtable
en Java.
Primero, entendamos qué son las tablas hash en general.
Podemos usar tablas hash para almacenar elementos en un patrón de par clave-valor, lo que significa que cada clave tiene un valor asociado. La clave es un valor único que se utiliza para indexar los valores. El valor son los datos relacionados con la clave correspondiente.
La estructura de datos de la tabla hash sigue el concepto de hash, donde se procesa un nuevo índice utilizando las claves. El elemento que corresponde a esa clave se almacena en el índice. Este es el concepto de hash.
Sea h(x)
la función hash, y k
es una clave, entonces h(k)
dará un nuevo índice para almacenar los elementos vinculados con k
.
Java HashMap
El HashMap
es una clase de marco de colecciones de Java que nos proporciona la estructura de datos de la tabla hash. Almacena los elementos como un par clave-valor, donde las claves son los identificadores únicos emparejados con un valor específico en un mapa. La clase HashMap
implementa la interfaz Map, que amplía aún más la interfaz Colecciones.
El HashMap
no está sincronizado, lo que significa que no es seguro para subprocesos. Podemos acceder a él usando múltiples hilos y modificarlo al mismo tiempo. Puede ser seguro para subprocesos externamente.
Otra característica de HashMap
es que puede contener una clave nula o pares de valores.
Por ejemplo,
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> h = new HashMap<>();
h.put("One", 1);
h.put("Two", 2);
h.put("Three", 3);
System.out.println(h);
}
}
Producción :
HashMap: {One=1, Two=2, Three=3}
Java Hashtable
La clase Hashtable
de Java implementa la estructura de datos de la tabla hash. Similar a HashMap
, también almacena los elementos como un par clave-valor. Pero se diferencia de un HashMap
en que está sincronizado. Almacena el par clave-valor en la tabla hash. Implementa la interfaz Map.
Primero, en la Hashtable
, especificamos el objeto como clave, con su valor como par. A continuación, se aplica un hash a la clave y, a continuación, se utiliza el código hash resultante como índice para el valor almacenado en la tabla.
Debido a esto, el problema asociado con Hashtable
es que la sincronización de cada llamada al método no es relativamente insignificante. No es necesario todo el tiempo. Por lo tanto, para superar este problema, los autores del marco de colecciones idearon una nueva clase llamada HashMap
(que también aclara que mapea los elementos) que no está sincronizada.
Si uno no quiere usar la sincronización a nivel de método, puede omitir la Hashtable
y usar Collections.synchronizedMap()
que convierte un mapa en un mapa sincronizado. Alternativamente, podríamos usar ConcurrentHashMap
, que según su documentación, ofrece la misma funcionalidad que Hashtable
pero tiene un mejor rendimiento y algunas funcionalidades adicionales.
Por ejemplo,
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[]) {
Hashtable<Integer, String> h = new Hashtable<>();
h.put(1, "one");
h.put(2, "two");
h.put(3, "three");
System.out.println(h);
}
}
Producción :
{3=three, 2=two, 1=one}
Java HashSet
El HashSet
es una clase de marco de colecciones de Java que nos proporciona la implementación de la estructura de datos de la tabla hash (como HashMap
). Aún así, implementa la interfaz Establecer
(a diferencia de HashMap
), que amplía aún más la interfaz de Colecciones. Esto se usa generalmente cuando no necesitamos asignar claves a pares de valores.
El HashSet
se diferencia de la Hashtable
en que HashSet
no puede contener valores duplicados. Los pares clave-valor son únicos. En términos de funcionalidad, HashSet
no tiene nada en común con el HashMap
en absoluto, pero sucede que utiliza un HashMap
internamente para implementar la interfaz Set.
Por ejemplo,
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<Integer> h = new HashSet<>();
h.add(5);
h.add(10);
h.add(15);
System.out.println(h);
}
}
Producción :
[5, 10, 15]
Artículo relacionado - Java HashMap
- Inicializar HashMap en Java
- Colisión en Hashmap en Java
- Ordenar HashMap en Java
- Ordenar un HashMap por clave en Java
- Diferencia entre hashmap y map en Java