CodeGym /Cursos /JAVA 25 SELF /“Seu dicionário” — HashMap...

“Seu dicionário” — HashMap<K,V>

JAVA 25 SELF
Nível 12 , Lição 2
Disponível

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:

  1. Separamos a string "java java core java" em palavras.
  2. Para cada palavra, verificamos se ela já está no dicionário (freq.get(w)).
  3. Se não estiver (null), é a primeira ocorrência da palavra → colocamos 1.
  4. 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.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION