Como inicializar um HashMap em Java e não enlouquecer: análise completa para iniciantes
\n\nVocê já escreveu em Java e sentiu que para criar um dicionário simples precisava escrever um poema inteiro? Especialmente quando você quer fazer isso de forma bonita e compacta, como em Python ou JavaScript. Dor familiar? No Stack Overflow, a pergunta sobre como inicializar um HashMap de forma literal acumulou milhares de visualizações. E isso não é por acaso.
\n\nNeste artigo, vamos analisar todas as formas legais de inicializar um HashMap em Java, desde a clássica até a moderna, com exemplos de código e explicações para iniciantes. Você aprenderá como preencher um mapa em uma única linha, quando usar Map.of() e por que o double brace initialization é uma faca de dois gumes.
Por que simplesmente "colocar" elementos é uma dor?
\n\nImagine que você precisa criar um HashMap com três pares "chave-valor". O código típico de um iniciante é assim:
\n\nHashMap<String, Integer> map = new HashMap<>();\nmap.put("apple", 5);\nmap.put("banana", 3);\nmap.put("orange", 7);\n\nAté que parece normal, mas quando você tem dez desses mapas, o código vira um lençol. Você quer concisão, certo? Em Python, isso é feito em uma linha: dict = {"apple": 5, "banana": 3}. E em Java? Spoiler: existem várias maneiras, e vamos analisá-las agora.
Método nº1: Double Brace Initialization (inicialização de chave dupla)
\n\nA maneira mais popular (e mais controversa) é o double brace initialization. Fica assim:
\n\nHashMap<String, Integer> map = new HashMap<>() {{\n put("apple", 5);\n put("banana", 3);\n put("orange", 7);\n}};\n\nComo funciona? As primeiras chaves criam uma classe interna anônima que herda de HashMap. As segundas são um bloco de inicialização de instância, que é executado quando o objeto é criado. Tudo dentro são chamadas put().
Prós:
\n- \n
- O código fica mais compacto e legível. \n
- Não precisa escrever várias linhas com
put(). \n
Contras (e são muitos):
\n- \n
- Desempenho: uma classe anônima é criada a cada vez. Isso é trabalho extra para a JVM. \n
- Memória: a classe anônima contém uma referência à classe externa, o que pode causar vazamento de memória. \n
- Serialização: se você tentar serializar esse mapa, podem surgir problemas. \n
- Incompatibilidade: não funciona com alguns frameworks (por exemplo, com algumas versões do Gson). \n
Conclusão: o método funciona, mas é melhor usá-lo apenas em código de teste ou em projetos pessoais. Para produção, não é recomendado.
\n\nMétodo nº2: Guava (biblioteca do Google)
\n\nSe você usa Google Guava (e é uma biblioteca muito popular), o problema é resolvido de forma elegante:
\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\nCaracterísticas:
\n- \n
- Cria um mapa imutável (immutable). \n
- O método
of()é sobrecarregado para 0–5 pares. Se for mais, useImmutableMap.builder(). \n - Ótimo para configurações e dados estáticos. \n
Desvantagem: precisa adicionar uma dependência externa. Se o projeto já usa Guava, ótimo. Se não, talvez não valha a pena.
\n\nMétodo nº3: Java 9+ — Map.of() e Map.ofEntries()
\n\nA partir do Java 9, a biblioteca padrão introduziu o método M