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
- Initialiser HashMap en Java
- Collision dans Hashmap en Java
- Trier HashMap en Java
- Trier une HashMap par clé en Java
- Différence entre hashmap et map en Java