HashMap, HashSet y Hashtable en Java

Hiten Kanwar 12 octubre 2023
  1. Java HashMap
  2. Java Hashtable
  3. Java HashSet
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

Artículo relacionado - Java Hashtable