HashMap, HashSet et Hashtable en Java

Hiten Kanwar 12 octobre 2023
  1. Java HashMap
  2. Java Hashtable
  3. Java HashSet
HashMap, HashSet et Hashtable en Java

L’interface Collection de Java nous fournit diverses interfaces et classes pour implémenter une variété de structures de données et d’algorithmes.

Ce tutoriel abordera HashMap, HashSet et Hashtable en Java.

Tout d’abord, comprenons ce que sont les tables de hachage en général.

Nous pouvons utiliser des tables de hachage pour stocker des éléments dans un modèle de paire clé-valeur, ce qui signifie que chaque clé a une valeur qui lui est associée. La clé est une valeur unique qui est utilisée pour indexer les valeurs. La valeur est la donnée liée à la clé correspondante.

La structure de données de la table de hachage suit le concept de hachage, où un nouvel index est traité à l’aide des clés. L’élément qui correspond à cette clé est alors stocké dans l’index. C’est le concept du hachage.

Soit h(x) la fonction de hachage, et k une clé, alors h(k) donnera un nouvel indice pour stocker les éléments liés à k.

Java HashMap

La HashMap est une classe du framework de collections Java qui nous fournit la structure de données de la table de hachage. Il stocke les éléments sous forme de paire clé-valeur, où les clés sont les identifiants uniques associés à une valeur spécifique sur une carte. La classe HashMap implémente l’interface Map, qui étend encore l’interface Collections.

Le HashMap n’est pas synchronisé, ce qui signifie qu’il n’est pas thread-safe. Nous pouvons y accéder en utilisant plusieurs threads et le modifier en même temps. Il peut être rendu thread-safe en externe.

Une autre caractéristique de HashMap est qu’il peut contenir une clé nulle ou des paires de valeurs.

Par exemple,

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);
  }
}

Production:

HashMap: {One=1, Two=2, Three=3}

Java Hashtable

La classe Hashtable de Java implémente la structure de données de la table de hachage. Semblable à HashMap, il stocke également les éléments sous forme de paire clé-valeur. Mais il diffère d’un HashMap car il est synchronisé. Il stocke la paire clé-valeur dans la table de hachage. Il implémente l’interface Map.

Tout d’abord, dans la Hashtable, nous spécifions l’objet en tant que clé, avec sa valeur en tant que paire. La clé est ensuite hachée, puis nous utilisons le code de hachage résultant comme index pour la valeur stockée dans la table.

De ce fait, le problème lié à Hashtable est que la synchronisation de chaque appel de méthode n’est relativement pas anodine. Ce n’est pas obligatoire à chaque fois. Par conséquent, pour surmonter ce problème, les auteurs du framework de collections ont proposé une nouvelle classe appelée HashMap (qui précise également qu’elle mappe les éléments) qui n’est pas synchronisée.

Si l’on ne souhaite pas utiliser la synchronisation au niveau de la méthode, on peut ignorer la Hashtable et utiliser Collections.synchronizedMap() qui transforme une carte en une carte synchronisée. Alternativement, nous pourrions utiliser ConcurrentHashMap, qui, selon sa documentation, offre les mêmes fonctionnalités que Hashtable mais a de meilleures performances et quelques fonctionnalités supplémentaires.

Par exemple,

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);
  }
}

Production:

{3=three, 2=two, 1=one}

Java HashSet

Le HashSet est une classe du framework de collections Java qui nous fournit la mise en œuvre de la structure de données de table de hachage (tout comme HashMap). Pourtant, il implémente l’interface Set (contrairement à HashMap), qui étend encore l’interface Collections. Ceci est généralement utilisé lorsque nous n’avons pas besoin de mapper des clés sur des paires de valeurs.

Le HashSet diffère de la Hashtable en ce sens que HashSet ne peut pas contenir de valeurs en double. Les paires clé-valeur sont uniques. En termes de fonctionnalité, HashSet n’a rien à voir avec le HashMap, mais il se trouve qu’il utilise un HashMap en interne pour implémenter l’interface Set.

Par exemple,

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);
  }
}

Production:

[5, 10, 15]

Article connexe - Java HashMap

Article connexe - Java Hashtable