1. Introdução
Nós já sabemos que ArrayList — é um “array infinito” que cresce sozinho. Mas ele tem uma limitação: o acesso aos elementos é feito pelo número (índice). Se temos uma lista com mil pessoas e queremos encontrar o telefone da Alice, precisamos saber o índice dela ou percorrer todos em sequência.
Na vida real, muitas vezes buscamos dados por um identificador único:
- pelo nome, buscamos o número de telefone,
- pelo número do passaporte, buscamos o proprietário,
- pelo login, encontramos a senha,
- pelo id, buscamos o objeto no banco.
Para isso, precisamos de uma estrutura capaz de: “receber a chave → encontrar imediatamente o valor”. Em Java, quem faz isso é o HashMap<K,V>.
Analogia:
Imagine um dicionário de papel. Você procura a tradução da palavra “house”. Não precisa folhear todas as páginas. Você vai direto à letra “H” e encontra a palavra desejada. O HashMap funciona da mesma forma: pela chave (a palavra) obtemos imediatamente o valor (a tradução).
Criando um dicionário
Para criar um dicionário, é preciso indicar quais tipos serão as chaves e quais serão os valores.
import java.util.HashMap;
HashMap<String, String> phonebook = new HashMap<String, String>();
Aqui:
- String (o primeiro tipo) é o tipo da chave (nome da pessoa).
- String (o segundo tipo) é o tipo do valor (número de telefone).
Agora, phonebook é como uma agenda telefônica de verdade.
Outros exemplos:
HashMap<String, Integer> grades = new HashMap<String, Integer>(); // nome → nota
HashMap<Integer, String> users = new HashMap<Integer, String>(); // id → nome
HashMap<String, Boolean> flags = new HashMap<String, Boolean>(); // chave → valor booleano
Ao contrário de ArrayList, um dicionário não tem o método add(), mas tem outros igualmente interessantes.
2. Método put(key, value) — adicionar um par
A principal diferença do HashMap em relação a arrays e listas é que ele armazena não apenas um conjunto de valores, mas pares chave–valor. Isso o torna parecido com um dicionário de verdade: cada palavra tem uma tradução, cada nome — um telefone, cada login — uma senha.
Exemplo:
phonebook.put("Alice", "+380501112233");
phonebook.put("Bob", "+380671234567");
Agora, na nossa agenda telefônica:
- a chave "Alice" está associada ao valor "+10501112233",
- a chave "Bob" está associada ao valor "+10671234567".
Isso significa que, para obter o valor (telefone), basta conhecer a chave (nome).
Importante: as chaves são únicas. Se tentarmos adicionar um novo valor para uma chave já existente, o valor antigo será sobrescrito.
phonebook.put("Alice", "+10999999999");
Agora, a Alice ficou apenas com o novo número: o antigo foi perdido.
Conclusão: put é um método para adicionar ou atualizar registros. Se a chave for nova — o registro é criado. Se a chave já existir — o registro é atualizado.
3. Método get(key) — obter um valor
Para encontrar um valor, é preciso saber a chave. Essa é a grande vantagem do HashMap: a busca por chave funciona muito rapidamente, praticamente de forma instantânea, independentemente de termos mil registros ou um milhão.
Exemplo:
System.out.println(phonebook.get("Alice"));
Saída:
+10501112233
Se a chave não existir, get retornará null:
System.out.println(phonebook.get("Charlie")); // null
Isso significa: “a chave "Charlie" não existe no dicionário”.
4. Método containsKey(key) — verificar existência
Para não topar com null, é útil verificar antes se a chave está no dicionário.
Exemplo:
System.out.println(phonebook.containsKey("Charlie"));
Saída:
false
Assim, podemos decidir de antemão:
- se a chave não existir — criamos um novo registro,
- se a chave existir — atualizamos o registro.
Padrão comum:
if (phonebook.containsKey("Alice"))
{
System.out.println("Alice já tem um número!");
}
else
{
phonebook.put("Alice", "+10111111111");
}
5. Método remove(key) — remover um registro
Remover é igualmente simples: você só precisa da chave.
phonebook.remove("Bob");
System.out.println(phonebook.get("Bob"));
Saída:
null
Agora não existe mais registro com a chave "Bob" no dicionário.
6. Percorrendo todos os pares
Muitas vezes precisamos não apenas obter dados por uma chave específica, mas também imprimir o dicionário inteiro. Para isso, usa-se o método entrySet().
for (var entry : phonebook.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
Exemplo de saída:
Alice -> +10501112233
Assim, obtemos acesso tanto à chave (entry.getKey()) quanto ao valor (entry.getValue()).
7. Prática: contagem de palavras
Vamos analisar um problema clássico — contar quantas vezes cada palavra aparece em um texto. Este é um dos exemplos mais claros de por que precisamos de um HashMap.
String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();
for (String w : text.split(" "))
{
Integer old = freq.get(w);
freq.put(w, (old == null) ? 1 : old + 1);
}
System.out.println(freq);
Saída:
{core=1, java=3}
Vamos detalhar o que acontece aqui:
- Separamos a string "java java core java" em palavras.
- Para cada palavra, verificamos se ela já está no dicionário (freq.get(w)).
- Se não estiver (null), é a primeira ocorrência da palavra → colocamos 1.
- Se já estiver, a palavra já apareceu antes → incrementamos o valor em uma unidade.
Aplicações reais:
- contagem de chamadas a uma API,
- estatística de frequência de palavras em um texto,
- armazenar a quantidade de itens em estoque.
8. Prática: agenda telefônica
Vamos escrever um aplicativo um pouco maior.
import java.util.HashMap;
import java.util.Scanner;
public class PhonebookApp {
public static void main(String[] args)
{
HashMap<String, String> phonebook = new HashMap<String, String>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Digite um nome (ou linha vazia para sair): ");
String name = console.nextLine();
if (name.isEmpty()) break;
System.out.print("Digite o número: ");
String phone = console.nextLine();
phonebook.put(name, phone);
}
System.out.println("Agenda telefônica:");
for (var entry : phonebook.entrySet())
{
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
O programa funciona como um mini-catálogo. Você digita nomes e telefones, eles são armazenados em um HashMap. No fim, é possível imprimir a lista completa. Dicionários são usados com muita frequência em projetos reais.
GO TO FULL VERSION