Comment initialiser HashMap en Java sans perdre la tête : analyse complète pour débutants
\n\nAvez-vous déjà écrit du code en Java en ayant l'impression que pour créer un simple dictionnaire, il fallait écrire tout un poème ? Surtout quand on veut le faire de manière élégante et compacte, comme en Python ou JavaScript. Une douleur familière ? Sur Stack Overflow, la question sur la façon d'initialiser HashMap de manière littérale a recueilli des milliers de vues. Et ce n'est pas un hasard.
\n\nDans cet article, nous allons passer en revue toutes les méthodes légales d'initialisation de HashMap en Java, de la classique à la moderne, avec des exemples de code et des explications pour les débutants. Vous apprendrez à remplir une map en une seule ligne, quand utiliser Map.of(), et pourquoi double brace initialization est une arme à double tranchant.
Pourquoi le simple fait d'« ajouter » des éléments est-il pénible ?
\n\nImaginez que vous deviez créer un HashMap avec trois paires « clé-valeur ». Le code typique d'un débutant ressemble à ceci :
\n\nHashMap<String, Integer> map = new HashMap<>();\nmap.put("apple", 5);\nmap.put("banana", 3);\nmap.put("orange", 7);\n\nCela semble correct, mais quand vous avez dix maps de ce type, le code devient une longue liste. On aimerait de la concision, n'est-ce pas ? En Python, cela se fait en une seule ligne : dict = {"apple": 5, "banana": 3}. Et en Java ? Spoiler : il existe plusieurs méthodes, et nous allons les analyser maintenant.
Méthode n°1 : Double Brace Initialization (double initialisation)
\n\nLa méthode la plus populaire (et la plus controversée) est la double brace initialization. Elle ressemble à ceci :
\n\nHashMap<String, Integer> map = new HashMap<>() {{\n put("apple", 5);\n put("banana", 3);\n put("orange", 7);\n}};\n\nComment cela fonctionne-t-il ? Les premières accolades créent une classe interne anonyme qui hérite de HashMap. Les secondes sont un bloc d'initialisation d'instance, qui s'exécute lors de la création de l'objet. Tout ce qui se trouve à l'intérieur correspond à des appels put().
Avantages :
\n- \n
- Le code devient plus compact et plus lisible. \n
- Pas besoin d'écrire plusieurs lignes avec
put(). \n
Inconvénients (et ils sont nombreux) :
\n- \n
- Performance : une classe anonyme est créée à chaque fois. C'est un travail supplémentaire pour la JVM. \n
- Mémoire : la classe anonyme contient une référence à la classe externe, ce qui peut provoquer des fuites mémoire. \n
- Sérialisation : si vous essayez de sérialiser une telle map, des problèmes peuvent survenir. \n
- Incompatibilité : ne fonctionne pas avec certains frameworks (par exemple, avec certaines versions de Gson). \n
Conclusion : la méthode fonctionne, mais il est préférable de l'utiliser uniquement dans du code de test ou des projets personnels. Pour la production, elle n'est pas recommandée.
\n\nMéthode n°2 : Guava (bibliothèque de Google)
\n\nSi vous utilisez Google Guava (et c'est une bibliothèque très populaire), le problème se résout élégamment :
\n\nimport com.google.common.collect.ImmutableMap;\n\nMap<String, Integer> map = ImmutableMap.of(\n "apple", 5,\n "banana", 3,\n "orange", 7\n);\n\nCaractéristiques :
\n- \n
- Crée une map immuable (immutable). \n
- La méthode
of()est surchargée pour 0 à 5 paires. Pour plus, utilisezImmutableMap.builder(). \n - Idéale pour les configurations et les données statiques. \n
Inconvénient : nécessite d'ajouter une dépendance externe. Si le projet utilise déjà Guava, c'est parfait. Sinon, le jeu n'en vaut peut-être pas la chandelle.
\n\nMéthode n°3 : Java 9+ — Map.of() et Map.ofEntries()
\n\nÀ partir de Java 9, la bibliothèque standard a introduit la méthode M