首页 > 编程笔记 > Java笔记 阅读:29

Java遍历Map的2种方法(附带实例)

在 Java 程序种使用集合的时候,遍历集合元素是十分常用的操作。

对 Map 集合而言,程序中经常需要取出 Map中所有的键和值进行特定处理,那么如何遍历 Map 中所有的键值对呢?Map 集合遍历和 Collection 单列集合遍历的方式基本类似,主要有两种方式可以实现:
接下来,以 HashMap 集合为例来分别对这两种集合遍历方式进行详细讲解。

Java Iterator迭代器遍历Map集合

使用 Iterator 迭代器遍历 Map 集合,有两种遍历方式:遍历键的集合和遍历键值对集合。这两种方式需要调用 Map 对应的两个方法,即 keySet() 和 entrySet()。

其中,keySet() 方法会返回由 Map 集合中所有键组成的 Set 集合,接着通过 Set 集合获取对应的 Iterator 对象,然后遍历 Map 集合中所有的键,再根据键获取相应的值。

接下来,通过案例来演示先遍历键,再根据键获取相应值,以此来遍历 Map 集合:
import java.util.*;

public class Demo {
    public static void main(String[] args) {
        Map map = new HashMap(); // 创建Map集合
        map.put("car1", "兰博基尼");
        map.put("car2", "劳斯莱斯");
        map.put("car3", "布加迪");
        System.out.println(map); // 存储元素
        Set keySet = map.keySet(); // 获取键的Set集合
        Iterator it = keySet.iterator(); // 迭代键的集合
        while (it.hasNext()) {
            Object key = it.next(); // 获取遍历到的键
            Object value = map.get(key); // 获取键所对应的值
            System.out.println(key + ":" + value);
        }
    }
}
程序的运行结果如下:

{car2=劳斯莱斯, car3=布加迪, car1=兰博基尼}
car2:劳斯莱斯
car3:布加迪
car1:兰博基尼

程序中第 10 行代码调用 Map 对象的 keySet() 方法,获得 Map 集合中所有键的 Set 集合,然后通过 Iterator 对象迭代 Set 集合的每一个键元素,然后通过 get(Object key)方法,根据键获取对应的值,并将键和值打印出来。

Iterator 迭代器遍历 Map 集合的另外一种方式是调用 Map 的 entrySet() 方法,该方法将 Map 集合中的每个键值对作为一个整体,组成 Set 集合并返回,接着将键值对的 Set 集合转换为 Iterator 对象,然后迭代获取集合中的每个键值对对象,再从对象中取出键和值。

接下来,修改实例 1 中的代码,通过使用 entrySet() 方法来进行 Map 集合遍历:
import java.util.*;

public class Demo {
    public static void main(String[] args) {
        Map map = new HashMap(); // 创建Map集合
        map.put("car1", "兰博基尼"); // 存储元素
        map.put("car2", "劳斯莱斯");
        map.put("car3", "布加迪");
        System.out.println(map);
        Set entrySet = map.entrySet(); // 获取键值对的Set集合
        Iterator it = entrySet.iterator(); // 获取Iterator对象
        while (it.hasNext()) {
            // 获取集合中键值对对象,并转为Map.Entry类型
            Map.Entry entry = (Map.Entry) (it.next());
            Object key = entry.getKey(); // 获取Entry中的键
            Object value = entry.getValue(); // 获取Entry中的值
            System.out.println(key + ":" + value);
        }
    }
}
程序的运行结果如下:

{car2=劳斯莱斯, car3=布加迪, car1=兰博基尼}
car2:劳斯莱斯
car3:布加迪
car1:兰博基尼

程序中首先调用 Map 对象的 entrySet() 方法获得 Map 中所有键值对对象的 Set 集合,这个集合中存放了 Map.Entry 类型的元素(Entry 是 Map 接口内部类),每个 Map.Entry 对象代表 Map 中的一个键值对,然后使用 Iterator 对象遍历键值对的 Set 集合,获得每一个键值对对象,接着分别调用键值对对象的 getKey() 和 getValue() 方法获取键和值。

JDK 8新方法遍历Map集合

与遍历 Collection 集合类似,在 JDK 8 中也根据 Lambda 表达式特性新增了一个 forEach(BiConsumer action) 方法,用于 Map 集合的遍历,该方法所需要的参数也是一个函数式接口,因此可以使用 Lambda 表达式的书写形式来进行集合遍历。

接下来,通过案例来演示如何使用 forEach(BiConsumer action) 方法遍历 Map 集合:
import java.util.HashMap;
import java.util.Map;

public class Demo {
    public static void main(String[] args) {
        Map map = new HashMap(); // 创建Map集合
        map.put("car1", "兰博基尼"); // 存储元素
        map.put("car2", "劳斯莱斯");
        map.put("car3", "布加迪");
        System.out.println(map);
        map.forEach((key, value) -> System.out.println(key + ":" + value));
    }
}
程序的运行结果下:

{car2=劳斯莱斯, car3=布加迪, car1=兰博基尼}
car2:劳斯莱斯
car3:布加迪
car1:兰博基尼

程序中使用了 JDK 8 中新增的 forEach() 方法来遍历集合元素,该方法接收的是一个用 Lambda 表达式书写的函数式接口 BiConsumer 的对象。在调用这个 forEach() 方法时,程序会逐一取出 Map 集合中的键和值,并传递给 Lambda 表达式的形参,然后在表达式的代码块中打印出来。

对于 Map 集合,除了以上两种主要的遍历方式外,还提供了一个 values() 方法,通过这个方法可以获取 Map 中所有值组成的 Collection 集合。

接下来,通过案例来演示 values() 方法的使用:
import java.util.*;

public class Demo {
    public static void main(String[] args) {
        Map map = new HashMap(); // 创建Map集合
        map.put("1", "Jack"); // 存储元素
        map.put("2", "Rose");
        map.put("3", "Lucy");
        System.out.println(map); // 打印集合
        Collection values = map.values(); // 获取Map集合中所有值的集合
        // 遍历Map集合的所有值,用临时变量v存储遍历到的值,并打印
        values.forEach(v -> System.out.println(v));
    }
}
程序的运行结果如下:

{1=Jack, 2=Rose, 3=Lucy}
Jack
Rose
Lucy

程序中通过调用 Map 集合的 values() 方法获取 Map 集合中所有值的 Collection 集合,然后以 forEach() 方法迭代输出集合中的每一个值。

相关文章