Interface Map e classe HashMap em Java
A interface Map<K, V>
representa um mapeamento, ou dicionário, em que cada elemento consiste em um par chave-valor. Todas as chaves são únicas dentro do objeto Map
. Essas coleções facilitam a busca de elementos quando a chave, que atua como identificador único, é conhecida.
Diferentemente de outras interfaces que representam coleções, a interface Map
não estende a interface Collection
.
Entre os métodos da interface Map
, destacam-se:
void clear()
: remove todos os elementos da coleção.boolean containsKey(Object k)
: retornatrue
se a coleção contém a chavek
.boolean containsValue(Object v)
: retornatrue
se a coleção contém o valorv
.Set<Map.Entry<K, V>> entrySet()
: retorna um conjunto com todos os elementos da coleção, cada um como objetoMap.Entry
.boolean equals(Object obj)
: retornatrue
se a coleção for idêntica à coleção passada no parâmetroobj
.boolean isEmpty()
: retornatrue
se a coleção estiver vazia.V get(Object k)
: retorna o valor associado à chavek
. Caso não exista, retornanull
.V getOrDefault(Object k, V defaultValue)
: retorna o valor associado à chavek
. Caso não exista, retornadefaultValue
.V put(K k, V v)
: adiciona um novo objeto com chavek
e valorv
. Se a chave já existir, o valor é substituído. Retorna o valor anterior parak
, se existia; caso contrário, retornanull
.V putIfAbsent(K k, V v)
: adiciona um novo objeto com chavek
e valorv
apenas se a chave ainda não existir.Set<K> keySet()
: retorna um conjunto com todas as chaves do mapeamento.Collection<V> values()
: retorna uma coleção com todos os valores do mapeamento.void putAll(Map<? extends K, ? extends V> map)
: adiciona todos os objetos do mapeamentomap
à coleção.V remove(Object k)
: remove o objeto associado à chavek
.int size()
: retorna o número de elementos na coleção.
O método put
serve para inserir ou substituir um objeto, enquanto get
recupera o valor pela chave. Implementações da interface Map
também permitem obter conjuntos de chaves ou valores. O método entrySet
retorna todos os elementos como objetos Map.Entry<K, V>
.
A interface genérica Map.Entry<K, V>
representa um objeto com chave do tipo K
e valor do tipo V
, e define métodos como:
boolean equals(Object obj)
: retornatrue
se o objetoobj
, que representaMap.Entry
, for idêntico ao atual.K getKey()
: retorna a chave do objeto.V getValue()
: retorna o valor do objeto.V setValue(V v)
: define o valorv
para o objeto atual.int hashCode()
: retorna o código hash do objeto.
Ao percorrer os objetos do mapeamento, esses métodos são utilizados para acessar chaves e valores.
Classes de mapeamentos. HashMap
A classe base para todos os mapeamentos é a classe abstrata AbstractMap
, que implementa a maioria dos métodos da interface Map
. A implementação mais comum é HashMap
, que realiza a interface Map
e herda de AbstractMap
.
Um exemplo de uso da classe segue abaixo:
import java.util.*;
public class Program {
public static void main(String[] args) {
Map<Integer, String> states = new HashMap<Integer, String>();
states.put(1, "Germany");
states.put(2, "Spain");
states.put(4, "France");
states.put(3, "Italy");
// obtemos o objeto pela chave 2
String first = states.get(2);
System.out.println(first);
// obtemos o conjunto completo de chaves
Set<Integer> keys = states.keySet();
// obtemos a coleção de todos os valores
Collection<String> values = states.values();
// substituímos um elemento
states.replace(1, "Poland");
// removemos o elemento pela chave 2
states.remove(2);
// percorremos os elementos
for (Map.Entry<Integer, String> item : states.entrySet()) {
System.out.printf("Key: %d Value: %s \n", item.getKey(), item.getValue());
}
Map<String, Person> people = new HashMap<String, Person>();
people.put("1240i54", new Person("Tom"));
people.put("1564i55", new Person("Bill"));
people.put("4540i56", new Person("Nick"));
for (Map.Entry<String, Person> item : people.entrySet()) {
System.out.printf("Key: %s Value: %s \n", item.getKey(), item.getValue().getName());
}
}
}
class Person {
private String name;
public Person(String value) {
name = value;
}
String getName() {
return name;
}
}
No exemplo acima, demonstramos as operações mais comuns com HashMap
. Inicialmente, criamos um mapa de Integer
para String
e o populamos com o método put()
. O método get()
é usado para recuperar um valor a partir de sua chave. Também vimos como obter coleções separadas de chaves (keySet()
) e valores (values()
). Métodos como replace()
e remove()
permitem a manipulação de entradas existentes.
A forma padrão de percorrer todos os pares chave-valor é iterar sobre o conjunto retornado por entrySet()
. Cada item desse conjunto é um objeto Map.Entry
, a partir do qual podemos obter a chave com getKey()
e o valor com getValue()
. O segundo mapa, de String
para Person
, ilustra como o HashMap
pode ser usado com qualquer tipo de objeto personalizado.
Resumo
Map
: Interface para mapeamentos de pares chave-valor, com chaves únicas e métodos para inserção, recuperação e manipulação.Map.Entry
: Interface que representa cada par chave-valor, com métodos para acessar e modificar componentes.HashMap
: Classe comum que implementaMap
, baseada em hash para armazenamento eficiente, com exemplos de uso para tipos primitivos e personalizados.
📝 Exercícios
Tarefa
Descrição: Você tem um Map
que armazena as capitais de alguns países. Percorra o mapa e imprima cada país e sua respectiva capital no formato "A capital de [PAÍS] é [CAPITAL]".
Código inicial:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, String> capitais = new HashMap<>();
capitais.put("Brasil", "Brasília");
capitais.put("França", "Paris");
capitais.put("Japão", "Tóquio");
// Use um loop for-each e o método entrySet() para percorrer o mapa.
}
}
Resposta
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, String> capitais = new HashMap<>();
capitais.put("Brasil", "Brasília");
capitais.put("França", "Paris");
capitais.put("Japão", "Tóquio");
// O método entrySet() retorna um Set de todos os pares chave-valor.
for (Map.Entry<String, String> par : capitais.entrySet()) {
String pais = par.getKey();
String capital = par.getValue();
System.out.println("A capital de " + pais + " é " + capital);
}
}
}