Aujourd’hui je n’ai pas trop d’inspiration alors j’ai regardé dans les Referers ce qui m’arrivait via Google.
Une des query était « lister le contenu d’une HashMap ». Je vais parler un petit peu de cette classe.
Tout d’abord rapidement, qu’est-ce qu’une
HashMap en Java ? C’est une des nouvelles classes
de l’API Java Collection qui permet de stocker dans un tableau une association de clé/valeur. Il s’agit du principe de l’interface java.util.Map. Les clés ne peuvent pas être null
mais par contre, les valeurs « null » sont autorisées pour une HashMap.
Prenons l’exemple d’une HashMap qui contient en tant que clé le prénom d’une personne et en tant que valeur, son âge sous la forme d’un Integer. Cela nous donne:
Clé (String) | Valeur (Integer) |
Zinedine Zidane | 28 |
Michael Jackson | 44 |
Georges W.Bush | 12 |
Footix | 4 |
Note: quand je disais que j’étais en manque d’inspiration, je le prouve encore ici 🙂
Une HashMap est casi identique à la class java.util.Hashtable que vous avez sans doute aussi croisé. Les différences sont que la HashMap n’est pas synchronisée et que vous pouvez avoir une valeur « null » alors qu’avec une Hashtable cela n’est pas possible. Cela complique un peu la chose parfois car si vous voyez une clé présente, vous devrez peut-être tester que la valeur associée n’est pas nulle…
Cette class n’est pas intéressante pour trier les données, et en plus lorsque vous allez l’itérer, si vous ajouter ensuite d’autres élements vous verrez peut-être que l’ordre des autres élements a changé. Bref ne vous en servez pas pour lister par ordre des élements. Les méthodes get()
et put(Object o)
par contre vous donnerons un temps d’accès casi-identique que vous accédiez au premier ou au dernier élement de cette Map. Visualisez un arbre en mémoire sur lequel les élements sont répartis.
Enfin comme d’autres objets Java du framework Collection, vous n’avez pas à vous souciez de l’allocation et de la taille
de la HashMap. De toute façon vous savez comme moi que les problèmes d’allocation sont mis de côté à partir du moment où vous travailler avec ces objets. Merci Java 🙂
Revenons à nos moutons enfin à notre liste d’invités et voyons comment itérer sur les clés, comment lister une HashMap. J’ai écrit rapidement le petit bout de code suivant:
// Creation d'une HashMap Map map=new HashMap(); map.put("Zinedine Zidane",new Integer(28)); map.put("Michael Jackson", new Integer(44)); map.put("Georges W.Bush", new Integer(12)); map.put("Footix",new Integer(4)); // Liste les clés for(Iterator i=map.keySet().iterator();i.hasNext();){ Object key=i.next(); System.out.println(key + "=" + map.get(key)); }
Après compilation voici le résultat de l’execution:
Michael Jackson=44 Footix=4 Georges W.Bush=12 Zinedine Zidane=28
Comme je le disais précedemment on voit que l’ordre d’affichage n’est pas l’ordre d’insertion.
Pour lister le contenu d’une HashMap, vous devez acquerir un Iterator sur la liste des clés, puis ensuite vous servir de cet Iterator pour lister le contenu. Pourquoi ? parce que la class Iterator va vous garantir que quelqu’un d’autre n’a pas modifié la HashMap alors que vous étiez entrain de l’afficher justement. Cela n’est pas garanti, car on ne maitrise pas la synchronisation, mais si cela arrive vous aurez une exception ConcurrentModificationException
. Voir la javadoc de la class HashMap pour plus d’informations.
Enfin si vous voulez lister uniquement les valeurs sans lister les clés, bien que je ne vois pas trop l’interêt, vous utiliserez la méthode values qui retourne un objet Collection
sur lequel vous allez ensuite pouvoir utiliser un Iterator:
public static void test3() { // Creation d'une HashMap Map map = new HashMap(); map.put("Robert", new Integer(28)); map.put("Roger", null); map.put("Ghislaine", new Integer(12)); map.put("Bernado", null); // Liste les clés for(Iterator i=map.values().iterator();i.hasNext();){ Object o= i.next() ; if(o!=null){ System.out.println(o.toString()); }else{ System.out.println("Valeur null"); } } }
A noter que j’utilise souvent des déclarations du type:
InterfaceName monObject=new InterfaceImplementation();
ce qui donne dans le code:
Map map=new HashMap();0 no like