在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对象的常见方法的更多相关文章

  1. Java遍历Map对象的四种方法

    在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHa ...

  2. java中遍历map对象的多种方法

    在Java中如何遍历Map对象   How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...

  3. java 遍历Map的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  4. java 遍历map的四种方法

    16:21:42 Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项( ...

  5. Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 :这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> m ...

  6. 【转】Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> ma ...

  7. Java遍历Map对象的方式

    public static void main(String[] args) { HashMap<String, String> testMap = new HashMap<> ...

  8. Java 遍历Map对象的4种方法

    http://blog.csdn.net/tjcyjd/article/details/11111401

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

    在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHa ...

  10. 转!! Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

随机推荐

  1. 获取Typora激活码的方法主要有以下几种

    ‌官方购买‌:访问Typora官网下载Typora软件.请注意,官网下载版本需购买激活,否则仅有15天试用期.购买费用为89元‌ 1. ‌使用激活工具‌:可以通过下载特定的激活工具来获取激活码.具体步 ...

  2. 强!10.8K star!推荐一款用于威胁预防、安全检测的开源监控平台,功能非常强大!!

    在当今数字化时代,网络安全威胁日益严峻,企业和组织对于高效.强大的安全解决方案的需求也愈发迫切. 今天给大家分享一个专注于安全监控的开源项目:Wazuh,正是应对这一挑战的有力武器,专门用于帮助个人和 ...

  3. 应急响应靶场之vulntarget-n

    vulntarget-n 用户名密码:root/Vulntarget@123 一.分析history命令 1.先将历史命令导出 history > 1.txt 2.分析history 1)篡改网 ...

  4. 前端解析excel表格实现

    1. 背景:在做react项目时,遇到一个解析excel的需求变更,把从原来后端解析变更为前端解析. 1.1 由于后端解析excel文件有安全隐患,因为项目中后端不允许上传文件,当然后端解析对前端来说 ...

  5. linux xxx is not in the sudoers file. This incident will be reported.

    前言 linux 报错:xxx is not in the sudoers file. This incident will be reported. 这意味着用户 xxx 没有在 sudoers 文 ...

  6. go mod 安装使用 beego

    go module基本使用 // 创建目录,初始化新项目 mkdir beemod cd beemod go mod init beemod 创建 server.go 文件 package main ...

  7. BGP四大属性

    **公认必遵**:Origin.AS_Path.Next_hop(所有BGP路由都必须识别这类属性,且必须在Update报文中传递,如果缺少就报错) Origin:指示路由信息的来源(如IGP.EGP ...

  8. llamacpp转换hf、vllm运行gguf

    Linux通过huggingface安装大模型 huggingface官网 https://huggingface.co/ wget https://repo.anaconda.com/minicon ...

  9. 网络编程-关闭连接(1)-C/C++相关系统调用

    背景 在linux网络编程中,经常需要编写关闭socket的代码,比如心跳检测失败需要关闭重连:网络报异常需要关闭重连.但究竟关闭操作做了什么,却不太清楚.目前项目使用Netty框架来实现的网络编程, ...

  10. argo-cd基于Kubernetes的声明式持续部署

    argo-cd基于Kubernetes的声明式持续部署 什么是argo-cd? Argo CD是一个基于Kubernetes的声明式GitOps持续交付工具. 为什么CD ? 应用程序定义.配置和环境 ...