Java 如何遍历 Map

在日常开发中,我们常会遇到需要遍历“键值对”集合的场景,比如存储用户ID和对应姓名的关系、商品ID和价格的对应,而Java里专门用来存这种数据的结构叫Map。很多新手刚接触Map时,容易搞混遍历的不同方法,今天就用生活化的例子,把这几种遍历方式讲明白。

先搞懂Map的“两个部分”

要遍历Map,首先得知道它由两部分组成:键(Key,相当于每个值的“身份证号”,不能重复)和值(Value,就是我们存的具体内容)。比如把Map比作一个通讯录,Key就是每个人的手机号(唯一),Value就是对应的姓名,遍历Map就是把所有“手机号+姓名”的组合找出来。

Java 如何遍历 Map

第一种:只需要“值”?用values()方法

如果我们只关心所有联系人的姓名,不需要手机号,那最简便的方式是直接取所有的值。就像翻通讯录只抄姓名,不用管对应的手机号。

举个例子,我们先初始化一个存商品的Map:

Map<Integer, String> productMap = new HashMap<>();

productMap.put(101, "笔记本电脑");

productMap.put(102, "无线鼠标");

productMap.put(103, "机械键盘");

只遍历商品名的话,代码就很简单:

for (String productName : productMap.values()) {

System.out.println("商品名:" + productName);

}

这种方法的优点是代码少,速度快,缺点是拿不到对应的键,适合只需要值的场景。

第二种:要键值对?用entrySet()方法

如果我们既需要商品ID,又需要商品名,这时候就用entrySet()——它相当于把每个“手机号+姓名”的小纸条打包成了一个整体(Entry对象),遍历的时候直接拆每一张纸条就行。

还是刚才的商品Map,遍历代码是:

for (Map.Entry<Integer, String> entry : productMap.entrySet()) {

Integer productId = entry.getKey();

String productName = entry.getValue();

System.out.println("商品ID:" + productId + ",商品名:" + productName);

}

这种方法是开发中最常用的,既能同时拿到键和值,效率也不错,适合绝大多数需要完整键值信息的场景。

第三种:只需要“键”?用keySet()方法

如果我们只需要所有商品的ID,不需要商品名,就可以用keySet(),它相当于把所有手机号单独拎出来,遍历手机号后再按需取对应姓名。

代码示例:

for (Integer productId : productMap.keySet()) {

String productName = productMap.get(productId);

System.out.println("商品ID:" + productId + ",对应商品名:" + productName);

}

但这里要注意,这种方法需要额外通过键去查值,相当于先翻所有手机号,再一个个找对应的姓名,比entrySet()多了一步查询,效率稍低,只适合只需要键的场景。

新手常踩的小坑

很多新手会犯一个错:在遍历Map时修改了里面的键或值,比如想删掉某个商品,直接在循环里写productMap.remove(entry.getKey())。这样会直接报错,就像翻通讯录时直接撕掉正在看的纸条,会打乱后面的顺序。正确的做法是用Iterator的remove方法,或者在循环里做标记,遍历完再统一修改。

另外,Java 8之后还支持更简洁的Lambda遍历,一行就能搞定键值对遍历:

productMap.forEach((id, name) -> System.out.println("ID:" + id + ",商品:" + name));

这种写法代码更短,适合简单的遍历操作。

总的来说,遍历Map没有“最好”的方法,只有“最合适”的——只取用values,要完整用entrySet,只取键用keySet,搭配场景选对方式,就能轻松搞定Map的遍历需求。

上一篇 Swift编程语言:从基础语法到高效开发的核心知识科普