CodeGym /Blogue Java /Random-PT /HashMap: que tipo de mapa é esse?
John Squirrels
Nível 41
San Francisco

HashMap: que tipo de mapa é esse?

Publicado no grupo Random-PT
Oi! Nesta lição, faremos uma revisão mais detalhada do Java HashMap . Anteriormente, estudamos estruturas de dados onde os elementos são armazenados como eles mesmos. Em um array ou ArrayList / LinkedList , armazenamos um certo número de elementos. Mas e se nossa tarefa mudar um pouco?
HashMap: que tipo de mapa é esse?  - 1
Imagine a seguinte tarefa: crie uma lista de 100 pessoas que armazene o nome e o número do passaporte de cada pessoa. Em princípio, isso não é tão difícil. Por exemplo, você pode inserir ambos em uma string e, em seguida, criar uma lista dessas strings: "Amelia Aguilar, 4211 717171". Mas esta solução tem duas desvantagens. Primeiro, podemos precisar da capacidade de pesquisar pelo número do passaporte. E isso será problemático devido a esse formato de armazenamento de informações. Em segundo lugar, nada nos impede de criar duas pessoas diferentes com o mesmo número de passaporte. E esta é a falha mais grave da nossa solução. Isso nunca deve ser permitido: não há duas pessoas com o mesmo número de passaporte. Uma nova estrutura de dados vem em nosso auxílio: Mapa. Também é conhecido como "array associativo", mas esse termo é usado com pouca frequência. Mais comumente, é chamado de "dicionário" ou "mapa". :) Como ele é fundamentalmente diferente das estruturas de dados que consideramos anteriormente? Acima de tudo, no fato de que os dados em um mapa são armazenados como pares chave-valor. Qualquer coisa pode servir como chaves e valores: números, strings ou objetos de outras classes. Hoje estudaremos a implementação mais comum da classe Map : Java HashMap . HashMap: que tipo de mapa é esse?  - 2

Então, o que precisamos saber sobre o HashMap em Java?

É muito fácil criar:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Aqui criamos um dicionário que armazena elementos como pares "número-string". O número atuará como a chave e a string como o valor. Também especificamos o tipo de chave (Integer) e o tipo de valor (String). Por que? Primeiro, uma chave HashMap é sempre única. Isso nos convém perfeitamente, pois podemos usar o número do passaporte como chave e evitar duplicatas. O valor será uma string com o nome completo (pessoas diferentes podem ter o mesmo nome; não temos nada com o que nos preocupar). Adicionar um novo par ao HashMap fica assim:

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
Usamos o método put() para isso. Além disso, HashMap substitui o método toString() para que possa ser exibido no console. A saída ficará assim: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan, o Grande} Agora vamos verificar se as chaves são realmente únicas? Vamos tentar adicionar um novo elemento com uma chave que já foi utilizada no mapa:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
Saída: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} Como você pode ver, o valor anterior associado à chave 162348 foi substituído. Usamos o termo "chave" por um motivo. Os valores em um HashMap são acessados ​​usando a chave, mas não o contrário. A chave não pode ser obtida usando um valor, pois os valores podem não ser únicos. Isso pode ser visto claramente ao obter ou remover um elemento do HashMap :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
Para obter um valor ou remover um par do dicionário, devemos passar para get() e remove() a chave única que corresponde ao valor. Ao contrário de arrays e listas, um HashMap em Java não possui índices numéricos: os valores são acessados ​​usando a chave. Saída do console: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} As classes ArrayList e LinkedList nos permitem verificar se a lista contém algum elemento específico. Java HashMap nos permite fazer isso. Além do mais, podemos fazer isso para ambos os membros do par: Isso é o que containsKey() (verifica uma chave) e containsValue()(verifica um valor) para os quais os métodos são.

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
Saída: false true Outro recurso conveniente do HashMap em Java é o fato de que você pode obter listas separadas de todas as chaves e todos os valores. Isso é feito com os métodos keySet() e values() :

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
As chaves são extraídas para um Set , que ainda não abordamos. É especial porque não pode conter elementos repetidos. Agora, o principal é lembrar que a lista de todas as chaves pode ser recuperada de um HashMap em uma coleção separada. No exemplo, salvamos os valores em um ArrayList comum . Saída do console: Chaves: [212133, 8082771, 162348] Valores: [Bridget Logan, Donald John Trump, Ivan, o Grande] Os métodos size() e clear() fazem exatamente a mesma coisa que nas estruturas anteriores que discutimos: o primeiro retorna o número de elementos atualmente no dicionário, o segundo remove todos os elementos.

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);
}
Output: 3 {} Para verificar se existe pelo menos um elemento em nosso HashMap , podemos usar o método isEmpty() :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
Saída: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan, o Grande} Agora só enviaremos a saída para o console após uma verificação preliminar. :) Outro ponto interessante é que dois mapas podem ser combinados em um só. Isso é feito usando o método putAll() . Nós o chamamos no primeiro HashMap , passamos o segundo como um argumento e os elementos do segundo são adicionados ao primeiro:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
Saída: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan, o Grande} Todos os pares em passaportesAndNames2 foram copiados para passaportesAndNames . Agora considere um exemplo mais complicado. Especificamente, iterando sobre um HashMap em um loop.

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
A classe Map.Entry denota o par chave-valor dentro do dicionário. O método entrySet() retorna uma lista de todos os pares em nosso HashMap . Como nosso mapa consiste nesses pares Map.Entry , estamos interagindo sobre os pares, não separando chaves ou valores. Saída: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan, o Grande Além disso, não se esqueça de estudar a documentação oficial do Oracle para HashMap .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION