Java 如何遍历 Map
在日常开发中,我们常会遇到需要遍历“键值对”集合的场景,比如存储用户ID和对应姓名的关系、商品ID和价格的对应,而Java里专门用来存这种数据的结构叫Map。很多新手刚接触Map时,容易搞混遍历的不同方法,今天就用生活化的例子,把这几种遍历方式讲明白。
先搞懂Map的“两个部分”
要遍历Map,首先得知道它由两部分组成:键(Key,相当于每个值的“身份证号”,不能重复)和值(Value,就是我们存的具体内容)。比如把Map比作一个通讯录,Key就是每个人的手机号(唯一),Value就是对应的姓名,遍历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的遍历需求。