阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Java中如何遍历Map对象的4种方法

85次阅读
没有评论

共计 1781 个字符,预计需要花费 5 分钟才能阅读完成。

导读 在 java 中遍历 Map 有不少的方法。我们看一下最常用的方法及其优缺点。既然 java 中的所有 map 都实现了 Map 接口,以下方法适用于任何 map 实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等)。
方法一 在 for-each 循环中使用 entries 来遍历

这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。

Map map = new HashMap();
 
for (Map.Entry entry : map.entrySet()) {System.out.println("Key =" + entry.getKey() + ", Value =" + entry.getValue());
 
}

注意:for-each 循环在 java 5 中被引入所以该方法只能应用于 java 5 或更高的版本中。如果你遍历的是一个空的 map 对象,for-each 循环将抛出 NullPointerException,因此在遍历前你总是应该检查空引用。

方法二 在 for-each 循环中遍历 keys 或 values。

如果只需要 map 中的键或者值,你可以通过 keySet 或 values 来实现遍历,而不是用 entrySet。

Map map = new HashMap();
 
// 遍历 map 中的键
 
for (Integer key : map.keySet()) {System.out.println("Key =" + key);
 
}
 
// 遍历 map 中的值
 
for (Integer value : map.values()) {System.out.println("Value =" + value);
 
}

该方法比 entrySet 遍历在性能上稍好(快了 10%),而且代码更加干净。

方法三使用 Iterator 遍历

使用泛型:

Map map = new HashMap();
 
Iterator> entries = map.entrySet().iterator();
 
while (entries.hasNext()) {Map.Entry entry = entries.next();
 
    System.out.println("Key =" + entry.getKey() + ", Value =" + entry.getValue());
 
}

不使用泛型:

Map map = new HashMap();
 
Iterator entries = map.entrySet().iterator();
 
while (entries.hasNext()) {Map.Entry entry = (Map.Entry) entries.next();
 
    Integer key = (Integer)entry.getKey();
 
    Integer value = (Integer)entry.getValue();
 
    System.out.println("Key =" + key + ", Value =" + value);
 
}

你也可以在 keySet 和 values 上应用同样的方法。
该种方式看起来冗余却有其优点所在。首先,在老版本 java 中这是惟一遍历 map 的方式。另一个好处是,你可以在遍历时调用 iterator.remove()来删除 entries,另两个方法则不能。根据 javadoc 的说明,如果在 for-each 遍历中尝试使用此方法,结果是不可预测的。从性能方面看,该方法类同于 for-each 遍历(即方法二)的性能。

方法四、通过键找值遍历(效率低)
Map map = new HashMap();
 
for (Integer key : map.keySet()) {Integer value = map.get(key);
 
    System.out.println("Key =" + key + ", Value =" + value);
 
}
 

作为方法一的替代,这个代码看上去更加干净;但实际上它相当慢且无效率。因为从键取值是耗时的操作(与方法一相比,在不同的 Map 实现中该方法慢了 20%~200%)。如果你安装了 FindBugs,它会做出检查并警告你关于哪些是低效率的遍历。所以尽量避免使用。

总结

如果仅需要键 (keys) 或值 (values) 使用方法二。如果你使用的语言版本低于 java 5,或是打算在遍历时删除 entries,必须使用方法三。否则使用方法一(键值都要)。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1781字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中