JavaRush /Blog Java /Random-FR /HashMap en Java - de quel type de carte s'agit-il ?

HashMap en Java - de quel type de carte s'agit-il ?

Publié dans le groupe Random-FR
Bonjour! Aujourd'hui, nous allons parler d'une autre structure de données - la carte. Son nom russe officiel est « tableau associatif », mais il n’est pas souvent utilisé. Les options les plus courantes sont « dictionnaire », « map » ou (le plus souvent) l'anglicisme d'argot « map » :) Dans Map, les données sont stockées au format « clé » - « valeur », c'est-à-dire par paires. Les clés et les valeurs peuvent être n'importe quel objet : nombres, chaînes ou objets d'autres classes.

En quoi Map diffère des autres structures de données

Auparavant, nous avons examiné les structures de données dans lesquelles les éléments sont stockés seuls. Dans un tableau, ou ArrayList / LinkedList , on stocke un certain nombre d'éléments. Mais que se passe-t-il si notre tâche change un peu ? Par exemple, imaginez que nous soyons confrontés à la tâche de créer une liste de 100 personnes, dans laquelle le nom complet et le numéro de passeport de la personne seront stockés. En principe, ce n'est pas si difficile. Par exemple, vous pouvez insérer les deux dans une ligne et créer une liste de lignes comme celle-ci : « Anna Ivanovna Reshetnikova, 4211 717171 ». Mais cette solution présente deux inconvénients. Premièrement, nous aurons peut-être besoin d’une fonction de recherche de passeport. Et avec ce format de stockage d'informations, cela sera problématique. Et deuxièmement, rien ne nous empêchera de créer deux personnes différentes avec les mêmes numéros de passeport. Et c’est là l’inconvénient le plus sérieux de notre solution. De telles situations doivent être totalement exclues : il n’y a pas deux personnes avec le même numéro de passeport. Ici, Map et ses fonctionnalités déclarées nous viennent en aide (stockage des données par paire au format « clé » - « valeur »). Examinons l'implémentation Map la plus courante - la classe Java HashMap .HashMap - de quel type de carte s'agit-il ?  - 1

Créer un HashMap en Java et travailler avec la classe

Cette implémentation est très simple à créer :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
Ici, nous avons créé un dictionnaire dans lequel les éléments seront stockés au format « chaîne de nombres ». Le nombre sera la clé et la chaîne sera la valeur. Nous avons également indiqué quel type de clés nous aurons ( Integer) et quel type de valeurs ( String). Pourquoi cela est-il ainsi? Premièrement, la clé dans un HashMap est toujours unique . Cela fonctionnera très bien pour nous car nous pouvons utiliser le numéro de passeport comme clé et éviter les doublons. Et la ligne avec le nom complet fera office de valeur (le nom complet de différentes personnes peut facilement être répété, il n’y a rien de mal à cela pour nous).

Ajouter une nouvelle paire à un HashMap

Cette tâche ressemble à ceci :
public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
La méthode est utilisée pour cela put(). De plus, HashMap dispose d'une méthode remplacée toString()afin qu'elle puisse être imprimée sur la console. Le résultat ressemblera à ceci : {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

Caractéristiques des clés HashMap

Vérifions maintenant si les clés sont vraiment uniques ? Essayons d'ajouter un nouvel élément avec une clé déjà existante dans la carte :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
Résultat : {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Viktor Mikhailovich Stychkin} L'élément précédent avec la clé 162348, comme vous pouvez le voir, a été écrasé. « La clé » a été appelée la clé pour une raison. Les valeurs d'un HashMap sont accessibles par clé (mais pas l'inverse - la clé ne peut pas être obtenue par valeur, car les valeurs peuvent être dupliquées). Cela se voit clairement dans les exemples d'obtention d'un élément, ainsi que de suppression d'un élément d'un HashMap :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);


   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);

}
Afin d'obtenir une valeur ou de supprimer une paire du dictionnaire, il faut passer aux get()méthodes remove()exactement la clé unique correspondant à cette valeur . Il n'y a pas d'index numériques, comme dans les tableaux ou les listes, dans HashMap - la valeur est accessible par clé. Sortie console : Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}

Vérification de la présence d'une clé et d'une valeur

Dans les classes ArrayList et LinkedList , nous pourrions vérifier si une liste contient un élément particulier. HashMap permet également de faire cela, et pour les deux parties de la paire : il dispose de méthodes containsKey()(vérifie la présence d'une clé) et containsValue()(vérifie la présence d'une valeur).
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");


   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));

}
Résultat : faux vrai

Obtenir une liste de toutes les clés et valeurs

Une autre fonctionnalité pratique de HashMap est que vous pouvez obtenir séparément une liste de toutes les clés et de toutes les valeurs . Pour cela, les méthodes keySet()et sont utilisées values():
public class Main {

   public static void main(String[] args) {

       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set<Integer> keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);

   }

}
Les clés sont extraites dans la collection Set. Sa particularité est qu’il ne peut pas contenir d’éléments répétitifs. Maintenant, la principale chose à retenir est que la liste de toutes les clés peut être extraite du HashMap dans une collection distincte. Dans l'exemple, nous avons enregistré les valeurs à la normale ArrayList. Sortie de la console : Clés : [212133, 8082771, 162348] Valeurs : [Lidiya Arkadyevna Bublikova, Donald John Trump, Ivan Mikhailovich Serebryakov] Les méthodes size()font clear()exactement la même chose que dans les structures précédentes que nous avons parcourues : la première renvoie un certain nombre d'éléments dans le dictionnaire à l'heure actuelle, le second supprime tous les éléments.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
Sortie : 3 {} Pour vérifier si notre HashMap possède au moins un élément, nous pouvons utiliser la méthodeisEmpty() :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
Sortie : {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov} Nous n'afficherons désormais sur la console qu'après vérification préliminaire :)

Combiner deux cartes en une seule

Un autre point intéressant est que deux cartes peuvent être combinées en une seule . Il existe une méthode pour cela putAll(). On l'appelle sur le premier HashMap , on passe le second en argument, et les éléments du second seront ajoutés au premier :
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
Sortie : {917352=Alexey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 925648=Maxim Olegovich Arkharov, 162348=Ivan Mikhailovich Serebryakov} Tous les éléments de passeportsAndNames2 ont été copiés dans passeportsAndNames . Regardons maintenant un exemple plus compliqué. À savoir, parcourir HashMap en boucle.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Une interface Map.Entrysignifie simplement une paire clé-valeur dans un dictionnaire. La méthode entrySet()renvoie une liste de toutes les paires de notre HashMap (puisque notre carte se compose uniquement de telles paires d'entrée, nous parcourons les paires, et non séparément les clés ou les valeurs). Conclusion : 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov Enregistrez cet article pour le futur : https://habr.com/ru/post/128017/ Maintenant, il est trop tôt pour le lire, mais dans le futur , lorsque vous maîtriserez HashMap, cela vous aidera à comprendre comment cette structure de données fonctionne de l'intérieur. N'oubliez pas non plus de consulter la documentation officielle d'Oracle sur HashMap.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION