HashMap:遍历HashMap的方式

郎家岭伯爵 2023年04月25日 477次浏览

前言

本文来总结下遍历 HashMap 的 5 种方式。

实现

使用Iterator遍历HashMap的EntrySet

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

/**
 * @author 郎家岭伯爵
 */
public class Test {

    public static void main(String[] args){
        Map< Integer, String > coursesMap = new HashMap<>();
        coursesMap.put(1, "C");
        coursesMap.put(2, "C++");
        coursesMap.put(3, "Java");
        coursesMap.put(4, "Python");
        coursesMap.put(5, "JavaScript");

        Iterator<Map.Entry<Integer, String>> iterator = coursesMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<Integer, String> entry = iterator.next();
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
    }
}

Map.entrySet() 方法返回一个 Set 集合,其中包含 Map 中所有的键值对。然后使用 Set 集合的迭代器来遍历Map中的所有键值对。

使用Iterator遍历HashMap的KeySet

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

/**
 * @author 郎家岭伯爵
 */
public class Test {

    public static void main(String[] args){
        Map< Integer, String > coursesMap = new HashMap<>();
        coursesMap.put(1, "C");
        coursesMap.put(2, "C++");
        coursesMap.put(3, "Java");
        coursesMap.put(4, "Python");
        coursesMap.put(5, "JavaScript");

        Iterator<Integer> iterator = coursesMap.keySet().iterator();
        while (iterator.hasNext()) {
            Integer key = iterator.next();
            System.out.println(key);
            System.out.println(coursesMap.get(key));
        }
    }
}

Map.keySet() 方法返回一个 Set 集合,其中包含 Map 中所有的键。然后同样使用 Set 集合的迭代器来遍历Map中的所有键。

增强for循环遍历HashMap的EntrySet

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

/**
 * @author 郎家岭伯爵
 */
public class Test {

    public static void main(String[] args){
        Map< Integer, String > coursesMap = new HashMap<>();
        coursesMap.put(1, "C");
        coursesMap.put(2, "C++");
        coursesMap.put(3, "Java");
        coursesMap.put(4, "Python");
        coursesMap.put(5, "JavaScript");

        for (Map.Entry<Integer, String> entry: coursesMap.entrySet()) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
    }
}

也可以使用增强 for 来遍历 keySet,这里不再赘述。

使用Lambda表达式遍历HashMap

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

/**
 * @author 郎家岭伯爵
 */
public class Test {

    public static void main(String[] args){
        Map< Integer, String > coursesMap = new HashMap<>();
        coursesMap.put(1, "C");
        coursesMap.put(2, "C++");
        coursesMap.put(3, "Java");
        coursesMap.put(4, "Python");
        coursesMap.put(5, "JavaScript");

        coursesMap.forEach((key, value) -> {
            System.out.println(key);
            System.out.println(value);
        });
    }
}

Lambda 表达式是 Java 8 中引入的一种新的语法,可以用来简化代码,使代码更加紧凑和易读。Lambda 表达式由参数列表、箭头符号和方法体组成,例如 (key, value) -> { System.out.println(key); System.out.println(value); } 就是一个 Lambda 表达式。其中,(key, value) 是参数列表,箭头符号 -> 将参数列表和方法体分开,{ System.out.println(key); System.out.println(value); } 是方法体。

forEach() 方法是 Map 接口中的一个默认方法,可以用来遍历 Map 中的所有键值对。

使用StreamAPI遍历HashMap

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

/**
 * @author 郎家岭伯爵
 */
public class Test {

    public static void main(String[] args){
        Map< Integer, String > coursesMap = new HashMap<>();
        coursesMap.put(1, "C");
        coursesMap.put(2, "C++");
        coursesMap.put(3, "Java");
        coursesMap.put(4, "Python");
        coursesMap.put(5, "JavaScript");

        // 使用StreamAPI遍历Map
        coursesMap.entrySet().stream().forEach(entry -> {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        });
    }
}

首先调用 entrySet() 方法获取 Map 中的键值对集合,然后调用 stream() 方法将集合转换为 Stream 对象。接着,调用 forEach() 方法对 Stream 中的每个元素执行指定的操作,这里使用 Lambda 表达式输出每个键值对的键和值。

除了 forEach() 方法外,Stream API 还提供了许多其他的操作,例如 filter()map()reduce()等,可以对 Map 中的键值对进行过滤、映射、聚合等操作。

总结

本文总结了 5 种遍历 HashMap 的方式。