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都 ...
随机推荐
- 介绍一下opentcs
OpenTCS是一个开源的自动运载系统(Automated Guided Vehicle,AGV)控制系统.它旨在管理和控制自动化运输车辆,例如AGV或自动搬运车(AMR),在工业和商业环境中执行各种 ...
- 【独立开发作品】SlideBrowser 一个轻量的滑动浏览器,给你不一样的交互体验
产品介绍 SlideBrowser是一个滑动浏览器,当你鼠标移动到屏幕边缘,自动出现,当失焦时自动隐藏. 使用场景 在应用全屏模式下查询资料.问 GPT 等 记录一些待办事项或者笔记 查看股市.币市信 ...
- mysql -- 自定义函数及循环结构
和存储过程类似,区别在于存储过程可以有0个或多个返回,但是函数只能有唯一一个返回值 一般而言,存储过程适合批量插入,批量删除,增删改:函数则用于处理数据,查询某个值. 创建 create functi ...
- 本地如何访问vue2 生成的dist代码
前言 当你使用 Vue CLI 或其他构建工具构建 Vue 2 项目时,它会生成一个 dist 文件夹,这个文件夹包含了你项目的生产环境版本的静态资源文件(HTML.JavaScript 和 CSS) ...
- RabbitMQ 消息实现过程+事务+消息确认
服务端(生产者) 1.引用 rabbitmq 包 2.建立连接工厂 connectionfactory 3.创建 频道 createchannel 4.在频道中 绑定消息队列 5.发布basicpub ...
- ASP.NET Web.config Transformations
... 参考文档 Web Deployment Content Map for Visual Studio and ASP.NET 微软ASP.NET站点部署指南(3):使用Web.Config文件的 ...
- android中大咖:TlistView
d的android中的Tlistview相当于cxGrid,其开发使用中的主咖地位至高无上. 可是如何高效使用快速实现的需求呢?需要的话补官方的教程 上图: GOODLUCK!
- CDF与开源DevOps持续交付系统JenkinsX,Spinnaker,Tekton,Screwdriver
什么是CDF 持续交付基金会(CDF)是许多快速增长的持续交付项目(包括Jenkins.Jenkins X.Spinnaker,Tekton和Screwdriver)的中立供应商.CDF通过开放模型. ...
- Codeforces Round 954 (Div. 3)
A. X Axis 1.既然要求每个点到a到距离之和最小,不妨让点a为3个点中的中间点,也就是先对三个数从小到大排序,然后输出首尾数减中间值的绝对值之和即可 #include <bits/std ...
- mybatis-plus.global-config.db-config.id-type=auto 和 @TableId(value = "id", type = IdType.ASSIGN_ID)哪个优先生效
对于id自动生成的方式,有注解和配置两种. 含义相同:不过设置自动增长的时候必须保证数据库中id是自增,assign_id和assign_uuid则不需要. yml配置: mybatis-plus: ...