如何在 Java 中迭代 HashMap?


Java HashMap 集合使用 (键,值) 对来存储数据。尽管它是非同步的,但它与 HashTable 相比。因此,多个线程可以访问 HashMap 而不遇到任何问题。尽管 HashMap 允许存储空键,但最多只能有一个空键对象和无限多个空值。关于映射的顺序,此类不提供任何保证。

键用于索引值。我们可以使用 HashMap 存储唯一的键。如果我们尝试插入一个重复的键,则相应键的元素将被替换。

不要忘记我们应该导入 java.util.HashMap 包才能使用 HashMap。

使用的方法

您可以使用四种主要方法来迭代 HashMap:

  • 在迭代器的帮助下迭代 HashMap EntrySet。

  • 在 for-each 循环和 lambda 的帮助下迭代 HashMap

  • 使用迭代器迭代 HashMap KeySet。

  • 使用 Stream API 遍历 HashMap。

方法 1:在迭代器的帮助下迭代 HashMap EntrySet

在这里,我们将使用 getValue() 和 getKey() 函数来迭代 HashMap。这是一个示例实现。

entryset()

我们在这里探讨的代码首先创建一个 HashMap,然后向其中提供一些键值对。随后,我们使用 for 循环中的 entrySet() 方法遍历 HashMap

算法

  • 步骤 1 - 导入所需的 Java 实用程序类。

  • 步骤 2 - 声明一个名为 Tutorialspoint 的公共类。

  • 步骤 3 - 使用 String[] args 参数定义 main 方法。

  • 步骤 4 - 创建一个名为 foodTable 的 HashMap 类的新实例,其键和值类型为 String。

  • 步骤 5 - 使用 put 方法向 foodTable 添加元素。

  • 步骤 6 - 启动一个循环,使用 entrySet 方法迭代 foodTable 中的条目。

  • 步骤 7 - 在每次迭代中,使用 set 变量检索当前条目。

  • 步骤 8 - 使用 System.out.println 打印当前条目的键值对。

  • 步骤 9 - 结束循环、main 方法和 Tutorialspoint 类。

示例

import java.util.HashMap;
import java.util.Map;

public class Tutorialspoint{

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

      // Incorporating elements to the adobe HashMap
      foodTable.put("C", "C Language");
      foodTable.put("R", "Ruby");
      foodTable.put("J", "Java");
      foodTable.put("P", "PHP");

      // Iterating HashMap through for loop
      for (Map.Entry<String, String> set :
      foodTable.entrySet()) {
         System.out.println(set.getKey() + " -> " + set.getValue());
      }
   }
}

输出

P -> PHP
R -> Ruby
C -> C Language
J -> Java

方法 2:在 for-each 循环和 Lambda 的帮助下迭代 HashMap

我们在此方法中使用 lambda 表达式,这些表达式自 Java 8 版以来即可使用。lambda 表达式对其输入参数的操作会产生一个值。无需将每个键值对转换为条目集即可使用 lambda 表达式解决此问题。

forEach()

此程序导入所需的 Java 实用程序类,构建一个名为“map”的 HashMap 对象,用键值对添加它,然后使用 forEach() 函数迭代它。它在每次迭代中显示公司名称和相应的净资产。

算法

  • 步骤 1 - 通过导入所需的 Java 实用程序类(Map 和 HashMap)来开始程序执行。

  • 步骤 2 - 创建一个名为“IterationInstance”的类。

  • 步骤 3 - 在“IterationInstance”类中,定义“main”方法。

  • 步骤 4 - 创建一个名为“map”的新 HashMap 对象,以保存组织名称及其各自的净资产值。

  • 步骤 5 - 现在,您可以使用“put”方法将条目合并到映射中。

  • 步骤 6 - 使用“forEach”方法迭代映射中的条目。

  • 步骤 7 - 在 lambda 表达式中,定义要对每个条目执行的行为:打印组织名称及其净资产。

  • 步骤 8 - 执行 lambda 表达式,打印映射中每个条目的公司名称和净资产。

  • 步骤 9 - 结束程序执行。

示例

import java.util.Map;   
import java.util.HashMap;   
public class IterationInstance {   
   public static void main(String[] arg) {   
      Map<String,String> map = new HashMap<String,String>();   
      map.put("Amazon", "$468 billion");   
      map.put("Apple", "$2.5 trillion"); 
      
      //iteration over map with the help of forEach() method  
      map.forEach((k,v) -> System.out.println("Company Name: "+ k + ", Net Value is: " + v));   
   }   
}

输出

Company Name: Apple, Net Value is: $2.5 trillion
Company Name: Amazon, Net Value is: $468 billion

方法 3:使用迭代器迭代 HashMap KeySet

这次,可以使用迭代器。由于 HashMap.entrySet() 提供了一个扩展 Collection 接口的集合,因此我们也可以使用使用 Map.entrySet().iterator 生成的 Iterator 实例。

While()

该代码创建一个 HashMap 对象并向其中提供键值对。然后,它遍历 HashMap 并打印每个对的键和值。

算法

  • 步骤 1 - 从 Java 实用程序库导入必要的类。

  • 步骤 2 - 然后,代码创建一个名为 intType 的 HashMap 对象,以存储整数键和字符串值。

  • 步骤 3 - 代码使用 put() 方法向 HashMap 添加键值对。

  • 步骤 4 - 然后,它通过在 HashMap 上调用 entrySet().iterator() 方法创建一个迭代器。

  • 步骤 5 - 代码使用 while 循环和迭代器的 hasNext() 方法遍历 HashMap。

  • 步骤 6 - 它使用迭代器的 next() 方法接收下一个 HashMap 条目。

  • 步骤 7 - 此代码然后使用 Map.Entry 对象的 getKey() 和 getValue() 方法检索每个条目的键和值。

  • 步骤 8 - 此代码然后使用 System.out.println() 方法打印键和值。

  • 步骤 9 - 现在,重复步骤 5-8,直到 HashMap 中没有其他条目。

示例

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

public class TLP {

   // Main driver method
   public static void main(String[] arguments){

      // Generating Hash map
      Map<Integer, String> intType
      = new HashMap<Integer, String>();

      // Incorporate data(Key-value pairs) into hashmap
      intType.put(11, "Eleven");
      intType.put(12, "Twelve");
      intType.put(13, "Thirteen");
      intType.put(14, "Fourteen");

      // Iterator
      Iterator<Entry<Integer, String> > new_Iterator
      = intType.entrySet().iterator();

      while (new_Iterator.hasNext()) {
         Map.Entry<Integer, String> new_Map
            = (Map.Entry<Integer, String>)
         new_Iterator.next();

         System.out.println(new_Map.getKey() + " = " + new_Map.getValue());
      }
   }
}

输出

11 = Eleven
12 = Twelve
13 = Thirteen
14 = Fourteen

方法 4:利用 Stream API 迭代 HashMap

流 API 是处理项目集合的有效工具。它允许我们在不更改原始数据结构的情况下对数据执行操作。

entrySet().stream()

该代码创建一个 HashMap 以存储整数键和相应的字符串值。然后,它向映射中添加四个键值对,并使用流和 forEach 打印映射中的每个键值对。输出显示键及其相应的值。

算法

  • 步骤 1 - 创建一个名为 intType 的 HashMap 以保存整数键和相应的字符串值。

  • 步骤 2 - 将键值对添加到 intType HashMap

  • 步骤 3 - 使用 entrySet() 函数迭代 intType HashMap 中的每个条目,即键值对。

  • 步骤 4 - 对于每个条目,显示键及其相应的值。

  • 步骤 5 - 最后,终止代码。

示例

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

public class TLP {

   public static void main(String[] arguments){
      Map<Integer, String> intType
         = new HashMap<Integer, String>();

      intType.put(1, "Apple");
      intType.put(2, "Cherry");
      intType.put(3, "Banana");
      intType.put(4, "Berries");
      intType.entrySet().stream().forEach(
         input
         -> System.out.println(input.getKey() + " = " + input.getValue())
      );
   }
}

输出

1 = Apple
2 = Cherry
3 = Banana
4 = Berries

结论

在 Java 中遍历 HashMap 是操作键值对时的一项常见任务。Java HashMap 提供了几种迭代技术,例如迭代器、带有 lambda 的 for-each 循环、带有迭代器的键集和流 API。

更新于: 2023-10-18

307 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告