Java遍历Map对象的常见方法
在Java中遍历Map有不少的方法,我们看一下最常用的方法及其优缺点。
既然Java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable 等等)
map.keySet();//键集合
map.values();//值集合
map.entrySet();//键值集合
方法一 在for-each循环中使用entrySet来遍历(Java8以下推荐)
这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。
public static void method1EntrySet(Map<String, Object> map) {
System.out.println(" 第一种方式 entrySet ");
// 如果map为空,就不执行for循环体
// map = new HashMap<>();
Set<Map.Entry<String, Object>> set2 = map.entrySet();
for (Map.Entry<String, Object> entry : set2) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
System.out.println("---- method2EntrySet done ----");
}
注意:for-each循环在java 5中被引入,所以该方法只能应用于java 5或更高的版本中。如果你遍历的是一个空的map对象,for-each循环将自动跳过循环体。
方法二 在for-each循环中遍历keys或values
如果只需要map中的键或者值,你可以通过遍历keySet或values实现,而不是用entrySet。
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("id", "21");
map.put("name", "Wiener");
map.put("age", "32");
System.out.println("使用增强for循环:");
for (String key : map.keySet()) {
System.out.println("k=" + key + ",v=" + map.get(key));
}
for (String v : map.values()) {
System.out.println("value=" + v);
}
}
如果只遍历key或者value,推荐使用此方法。
方法三 使用迭代器Iterator遍历
public static void methodIterator(Map<String, Object> map) {
System.out.println(" 第三种遍历方式 method4Iterator");
Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, Object> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
}
你也可以在keySet和values上应用该方法。
该种方式看起来冗余却有其优点所在。首先,在老版本java中这是惟一遍历map的方式。另一个好处是,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。根据javadoc的说明,如果在for-each遍历中尝试使用此方法,结果是不可预测的。
从性能方面看,该方法类同于for-each遍历(即方法二)的性能。
方法四 通过键找值遍历
public static void methodGetKey(Map<String, Object> map) {
System.out.println(" 第四种方式 methodGetKey ");
Set<String> keSet = map.keySet();
for (Iterator<String> iterator = keSet.iterator(); iterator.hasNext(); ) {
String key = iterator.next();
System.out.println(key + " value: " + map.get(key));
}
}
该方法与方法一的功能相同,但是,它看上去更加整洁;但实际上它相当慢且效率极低。因为从键取值是耗时的操作,姑尽量避免使用。
方法五 使用Lambda表达式(Java8推荐)
private static void methodLambda(Map<String, Object> map) {
System.out.println("使用Lambda表达式进行遍历:");
map.forEach((key, value) -> System.out.println("key:value = " + key + ":" + value));
System.out.println("使用Lambda表达式遍历key:");
map.keySet().forEach(key ->
System.out.println(" key==>" + key + ",对应的value==>" + map.get(key)));
System.out.println("使用Lambda表达式遍历value:");
map.values().forEach(value -> System.out.println(value));
}
方法六 使用jdk8的foreach方法
private static void methodBiConsumer(Map<String, String> map) {
System.out.println("使用Java 8的forEach进行遍历:");
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String key, String value) {
System.out.println("k=" + key + ",v=" + value);
}
});
}
方法七 使用jdk8的Stream流
private static void methodStream(Map<String, String> map) {
System.out.println("使用stream流进行遍历:");
map.entrySet().stream().forEach((Map.Entry entry) -> {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
});
}
如果需要对Map集合进行一些中间处理,如过滤操作,使用流式遍历也很方便。
总结
如果仅需要键(keys)或值(values),请使用方法二。如果打算在遍历时删除entries,必须使用方法三。否则使用方法一(键值都要)。当然了,推荐使用for-each方法。
第一和第三种的区别,其实就是使用迭代器iteratior和使用一般的for语句的区别,和map本身倒没什么关系。最简单的判断方法,就是对要迭代的内容(本例是个map,如果是一个list同理),在循环过程中,你需要进行add或者remove操作不。for语句的循环是不能做这样的操作的,只能使用迭代器。
Java遍历Map对象的常见方法的更多相关文章
- Java遍历Map对象的四种方法
在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHa ...
- java中遍历map对象的多种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...
- java 遍历Map的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- java 遍历map的四种方法
16:21:42 Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项( ...
- Java遍历Map对象的四种方式
关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 :这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> m ...
- 【转】Java遍历Map对象的四种方式
关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> ma ...
- Java遍历Map对象的方式
public static void main(String[] args) { HashMap<String, String> testMap = new HashMap<> ...
- Java 遍历Map对象的4种方法
http://blog.csdn.net/tjcyjd/article/details/11111401
- Java中如何遍历Map对象的4种方法
在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHa ...
- 转!! Java中如何遍历Map对象的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
随机推荐
- Keepalived学习,双主热备高可用
双主热备可以看做双机主备的升级(双机主备链接 https://www.cnblogs.com/hmxs/p/12041735.html),它是为了让两台设备都能提供服务,而不是主节点正常时,备用节点一 ...
- 性能对比实验折线图绘制代码(YOLO系列为例)
本文用于绘制性能折线图,适用于对比实验,发现很多博文都是收费,欺负哥们懒得学习,一气之下ai了一下再进行代码修改,免费供给大家学习参考,便于大家撰写论文数据时利于绘制图像. import pandas ...
- 非局域网远程访问MySQL
使用内网穿透解决,市面上说道最多的是"花生壳" 主要操作见这篇官方说明 但其中提到的什么花生棒(第二.三点)完全不用管,应该算是产品推销. 登录后选"新增内网映射&quo ...
- Golang 入门 : 整型
整型介绍 Go语言同时提供了有符号和无符号类型的整数运算.这里有 int8.int16.int32 和 int64 四种截然不同大小的有符号整形数类型,分别对应 8.16.32.64 bit大小的有符 ...
- 1、从DeepSeek API调用到Semantic Kernel集成:深度解析聊天机器人开发全链路
引言:AI时代下的聊天机器人开发范式演进 在生成式AI技术爆发的当下,基于大语言模型(LLM)的聊天机器人开发已形成标准化技术链路.本文将结合DeepSeek API与微软Semantic Kerne ...
- 在 CentOS 系统下搭建 ZeroTier Moon 服务器
安装 ZeroTier One: 首先,确保已经安装了 ZeroTier One.你可以按照上述说明,使用以下命令进行安装: sudo yum install zerotier-one 启动 Zero ...
- Gin CORS
Go 语言手搓一个简单的跨域还是比较容易的, 但自己手搓一批通用代码总归还是麻烦了点. 如果使用 Gin 的话, 有现成的跨域中间件可以用. github.com/gin-contrib/cors 注 ...
- 如何学习SLAM(超级全面)
如何学习SLAM(超级全面) 由于SLAM是一个错综复杂的研究领域,涉及到非常多的关键技术.这里先讲讲学习方法论,然后对一些关键性概念(包括SLAM.ROS.SLAM移动机器人)进行分析,最后给出典型 ...
- vue路由params传参时出现undefined
1.问题: 使用params方式传参时(参数不显示的方式) 获取参数时,参数undefined 2.解决: push时请使用name,不要使用path(路由的params对象使用,必须通过路由名nam ...
- Navicat Premium 16激活教程(NavicatCracker)
1.安装Navicat Premium 16 (注意版本,这里以此版本为例):并下载激活工具 1.1.Navicat Premium 下载路径: http://www.navicat.com.cn/d ...