Inicialização de HashMap em Java: o segredo da forma "literal"

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como inicializar um HashMap em Java e não enlouquecer: análise completa para iniciantes

\n\n

Você 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\n

Neste 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.

\n\n

Por que simplesmente "colocar" elementos é uma dor?

\n\n

Imagine que você precisa criar um HashMap com três pares "chave-valor". O código típico de um iniciante é assim:

\n\n
HashMap<String, Integer> map = new HashMap<>();\nmap.put("apple", 5);\nmap.put("banana", 3);\nmap.put("orange", 7);
\n\n

Até 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.

\n\n

Método nº1: Double Brace Initialization (inicialização de chave dupla)

\n\n

A maneira mais popular (e mais controversa) é o double brace initialization. Fica assim:

\n\n
HashMap<String, Integer> map = new HashMap<>() {{\n    put("apple", 5);\n    put("banana", 3);\n    put("orange", 7);\n}};
\n\n

Como 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().

\n\n

Prós:

\n
    \n
  • O código fica mais compacto e legível.
  • \n
  • Não precisa escrever várias linhas com put().
  • \n
\n\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
\n\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\n

Método nº2: Guava (biblioteca do Google)

\n\n

Se você usa Google Guava (e é uma biblioteca muito popular), o problema é resolvido de forma elegante:

\n\n
import com.google.common.collect.ImmutableMap;\n\nMap<String, Integer> map = ImmutableMap.of(\n    "apple", 5,\n    "banana", 3,\n    "orange", 7\n);
\n\n

Características:

\n
    \n
  • Cria um mapa imutável (immutable).
  • \n
  • O método of() é sobrecarregado para 0–5 pares. Se for mais, use ImmutableMap.builder().
  • \n
  • Ótimo para configurações e dados estáticos.
  • \n
\n\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\n

Método nº3: Java 9+ — Map.of() e Map.ofEntries()

\n\n

A partir do Java 9, a biblioteca padrão introduziu o método M

Blogs

Book Recommendations