AFF Education Construa seu Futuro

Aula 57 - Dicionário Chave-Valor (HashMap)

O que é um HashMap (Dicionário)?

Um HashMap é uma estrutura de dados que armazena pares de chave-valor. É como um dicionário onde você procura uma palavra (chave) e encontra seu significado (valor).

Características do HashMap:

Analogia: Pense em um HashMap como uma agenda telefônica, onde o nome é a chave e o telefone é o valor.

Criando e Usando HashMap

Vamos criar nosso primeiro HashMap:

import java.util.HashMap;

public class PrimeiroHashMap {
    public static void main(String[] args) {
        // Criando HashMap<String, String> (chave: String, valor: String)
        HashMap<String, String> capitais = new HashMap<>();
        
        // Adicionando pares chave-valor com put()
        capitais.put("Brasil", "Brasília");
        capitais.put("Argentina", "Buenos Aires");
        capitais.put("Chile", "Santiago");
        capitais.put("Peru", "Lima");
        capitais.put("Uruguai", "Montevidéu");
        
        // Exibindo o HashMap completo
        System.out.println("HashMap de capitais:");
        System.out.println(capitais);
        
        // Acessando valores pela chave com get()
        System.out.println("\nCapital do Brasil: " + capitais.get("Brasil"));
        System.out.println("Capital da Argentina: " + capitais.get("Argentina"));
        System.out.println("Capital do Chile: " + capitais.get("Chile"));
        
        // Tamanho do HashMap
        System.out.println("\nTotal de países: " + capitais.size());
    }
}

HashMap de capitais:

{Brasil=Brasília, Chile=Santiago, Peru=Lima, Uruguai=Montevidéu, Argentina=Buenos Aires}

Capital do Brasil: Brasília

Capital da Argentina: Buenos Aires

Capital do Chile: Santiago

Total de países: 5

Métodos Principais do HashMap

Vamos explorar os métodos mais importantes:

import java.util.HashMap;

public class MetodosHashMap {
    public static void main(String[] args) {
        HashMap<String, Integer> idades = new HashMap<>();
        
        // 1. put(chave, valor) - adiciona ou atualiza
        idades.put("Ana", 25);
        idades.put("Bruno", 30);
        idades.put("Carlos", 28);
        System.out.println("HashMap inicial: " + idades);
        
        // 2. get(chave) - obtém o valor
        int idadeAna = idades.get("Ana");
        System.out.println("\nIdade da Ana: " + idadeAna);
        
        // 3. containsKey(chave) - verifica se a chave existe
        System.out.println("\nContém 'Bruno'? " + idades.containsKey("Bruno"));
        System.out.println("Contém 'Diana'? " + idades.containsKey("Diana"));
        
        // 4. containsValue(valor) - verifica se o valor existe
        System.out.println("\nContém idade 30? " + idades.containsValue(30));
        System.out.println("Contém idade 40? " + idades.containsValue(40));
        
        // 5. remove(chave) - remove o par chave-valor
        idades.remove("Carlos");
        System.out.println("\nApós remover Carlos: " + idades);
        
        // 6. size() - retorna o tamanho
        System.out.println("Tamanho: " + idades.size());
        
        // 7. isEmpty() - verifica se está vazio
        System.out.println("Está vazio? " + idades.isEmpty());
        
        // 8. clear() - limpa tudo
        idades.clear();
        System.out.println("\nApós clear(): " + idades);
        System.out.println("Está vazio agora? " + idades.isEmpty());
    }
}

HashMap inicial: {Ana=25, Bruno=30, Carlos=28}

Idade da Ana: 25

Contém 'Bruno'? true

Contém 'Diana'? false

Contém idade 30? true

Contém idade 40? false

Após remover Carlos: {Ana=25, Bruno=30}

Tamanho: 2

Está vazio? false

Após clear(): {}

Está vazio agora? true

Percorrendo HashMap

Existem várias formas de percorrer um HashMap:

Diagrama do for-each iterando sobre keySet de um HashMap
Figura — Visualização do for-each percorrendo o resultado de emails.keySet() — apenas as chaves do HashMap. A cada iteração, nome recebe a próxima chave (ex.: "João", "Maria", "Pedro"); o valor associado pode ser obtido com emails.get(nome).
import java.util.HashMap;

public class PercorrerHashMap {
    public static void main(String[] args) {
        HashMap<String, String> emails = new HashMap<>();
        emails.put("João", "joao@email.com");
        emails.put("Maria", "maria@email.com");
        emails.put("Pedro", "pedro@email.com");
        
        // Forma 1: Percorrer apenas as chaves
        System.out.println("=== Forma 1: Apenas chaves ===");
        for (String nome : emails.keySet()) {
            System.out.println(nome);
        }
        
        // Forma 2: Percorrer apenas os valores
        System.out.println("\n=== Forma 2: Apenas valores ===");
        for (String email : emails.values()) {
            System.out.println(email);
        }
        
        // Forma 3: Percorrer chaves e valores
        System.out.println("\n=== Forma 3: Chaves e valores ===");
        for (String nome : emails.keySet()) {
            String email = emails.get(nome);
            System.out.println(nome + " → " + email);
        }
        
        // Forma 4: Usando entrySet()
        System.out.println("\n=== Forma 4: entrySet() ===");
        for (var entry : emails.entrySet()) {
            System.out.println(entry.getKey() + " → " + entry.getValue());
        }
    }
}

=== Forma 1: Apenas chaves ===

João

Maria

Pedro

=== Forma 2: Apenas valores ===

joao@email.com

maria@email.com

pedro@email.com

=== Forma 3: Chaves e valores ===

João → joao@email.com

Maria → maria@email.com

Pedro → pedro@email.com

=== Forma 4: entrySet() ===

João → joao@email.com

Maria → maria@email.com

Pedro → pedro@email.com

HashMap com Diferentes Tipos

HashMap pode usar diferentes tipos para chaves e valores:

import java.util.HashMap;

public class HashMapTipos {
    public static void main(String[] args) {
        // HashMap<String, Integer> - preços de produtos
        HashMap<String, Double> precos = new HashMap<>();
        precos.put("Notebook", 3500.00);
        precos.put("Mouse", 80.00);
        precos.put("Teclado", 250.00);
        
        System.out.println("=== PREÇOS ===");
        for (String produto : precos.keySet()) {
            System.out.printf("%s: R$ %.2f\n", produto, precos.get(produto));
        }
        
        // HashMap - matrícula e nome
        HashMap<Integer, String> alunos = new HashMap<>();
        alunos.put(101, "Ana Silva");
        alunos.put(102, "Bruno Costa");
        alunos.put(103, "Carlos Souza");
        
        System.out.println("\n=== ALUNOS ===");
        for (Integer matricula : alunos.keySet()) {
            System.out.println("Matrícula " + matricula + ": " + alunos.get(matricula));
        }
        
        // HashMap - status de tarefas
        HashMap<String, Boolean> tarefas = new HashMap<>();
        tarefas.put("Estudar Java", true);
        tarefas.put("Fazer exercícios", false);
        tarefas.put("Revisar conteúdo", true);
        
        System.out.println("\n=== TAREFAS ===");
        for (String tarefa : tarefas.keySet()) {
            String status = tarefas.get(tarefa) ? "✓ Concluída" : "✗ Pendente";
            System.out.println(tarefa + ": " + status);
        }
    }
}

=== PREÇOS ===

Notebook: R$ 3500.00

Mouse: R$ 80.00

Teclado: R$ 250.00

=== ALUNOS ===

Matrícula 101: Ana Silva

Matrícula 102: Bruno Costa

Matrícula 103: Carlos Souza

=== TAREFAS ===

Estudar Java: ✓ Concluída

Fazer exercícios: ✗ Pendente

Revisar conteúdo: ✓ Concluída

Exemplo Prático: Agenda Telefônica

Vamos criar uma agenda telefônica completa usando HashMap:

import java.util.HashMap;
import java.util.Scanner;

public class AgendaTelefonica {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        HashMap<String, String> agenda = new HashMap<>();
        
        while (true) {
            System.out.println("\n=== AGENDA TELEFÔNICA ===");
            System.out.println("1. Adicionar contato");
            System.out.println("2. Buscar telefone");
            System.out.println("3. Remover contato");
            System.out.println("4. Listar todos");
            System.out.println("5. Sair");
            System.out.print("Escolha: ");
            
            int opcao = entrada.nextInt();
            entrada.nextLine();
            
            if (opcao == 1) {
                System.out.print("Nome: ");
                String nome = entrada.nextLine();
                System.out.print("Telefone: ");
                String telefone = entrada.nextLine();
                agenda.put(nome, telefone);
                System.out.println("Contato adicionado!");
                
            } else if (opcao == 2) {
                System.out.print("Nome: ");
                String nome = entrada.nextLine();
                if (agenda.containsKey(nome)) {
                    System.out.println("Telefone: " + agenda.get(nome));
                } else {
                    System.out.println("Contato não encontrado!");
                }
                
            } else if (opcao == 3) {
                System.out.print("Nome: ");
                String nome = entrada.nextLine();
                if (agenda.remove(nome) != null) {
                    System.out.println("Contato removido!");
                } else {
                    System.out.println("Contato não encontrado!");
                }
                
            } else if (opcao == 4) {
                if (agenda.isEmpty()) {
                    System.out.println("Agenda vazia!");
                } else {
                    System.out.println("\n=== CONTATOS ===");
                    for (String nome : agenda.keySet()) {
                        System.out.println(nome + ": " + agenda.get(nome));
                    }
                }
                
            } else if (opcao == 5) {
                System.out.println("Até logo!");
                break;
            }
        }
        
        entrada.close();
    }
}

=== AGENDA TELEFÔNICA ===

1. Adicionar contato

2. Buscar telefone

3. Remover contato

4. Listar todos

5. Sair

Escolha: 1

Nome: João

Telefone: 99999-1234

Contato adicionado!

Tabela de Métodos do HashMap

Método Descrição Exemplo
put(chave, valor) Adiciona ou atualiza par map.put("Ana", 25)
get(chave) Retorna o valor da chave map.get("Ana")
remove(chave) Remove o par chave-valor map.remove("Ana")
containsKey(chave) Verifica se tem a chave map.containsKey("Ana")
containsValue(valor) Verifica se tem o valor map.containsValue(25)
size() Retorna o tamanho map.size()
isEmpty() Verifica se está vazio map.isEmpty()
clear() Remove todos os pares map.clear()
keySet() Retorna conjunto de chaves map.keySet()
values() Retorna coleção de valores map.values()

Exercícios

Teste seus conhecimentos sobre HashMap em Java:

1. O que é um HashMap?

2. Como adicionar o par ("Brasil", "Brasília") em um HashMap chamado capitais?

3. Como obter o valor associado à chave "Brasil" no HashMap capitais?

4. Qual método verifica se uma chave existe no HashMap?

5. Qual método retorna todas as chaves de um HashMap?

Exercícios de Aplicação AFF Education

Reforce o conteúdo desta aula com mais dois exercícios práticos:

1. Em um HashMap<String, Integer> mapa, como associar a chave "idade" ao valor 30?

2. Como recuperar o valor associado à chave "idade"?