Java遍历Map效率对比

Java遍历Map效率对比Java中Map容器的遍历有多种方式,但是不同的方式效率会大有不同,以前没有注意这些细节,随意使用遍历方式在本地可能没有什么影响,但是在项目在高频使用需要特别注意,尽量使用高效的方式。首先,Map.Entry<K,V>是可以包含了Key和Value的,keySet包含了所有的Key,再使用get方法可以拿到对应的Value;所以包含Key和Value内容…

大家好,又见面了,我是你们的朋友全栈君。

Java遍历Map效率对比

Java 中Map容器的遍历有多种方式,但是不同的方式效率会大有不同,以前没有注意这些细节,随意使用遍历方式在本地可能没有什么影响,但是在项目在高频使用需要特别注意,尽量使用高效的方式。

首先,Map.Entry<K,V>是可以包含了Key和Value的,keySet包含了所有的Key,再使用get方法可以拿到对应的Value;所以包含Key和Value内容的就有两种方式,我们再看访问模式,可以使用迭代器Iterator 访问,也可以使用For循环访问;那么2种包含方式和访问模式组合起来就是4种访问方式

初始化Map

导入相应的包

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

我们选择不同规模Key记录来测试不同方式的差异

    Map<String, String> map = new HashMap<>();
    String key, value;
    int num = 10000; // num值从{1w, 10w, 100w, 1000w}中选择
    for (int i = 1; i <= num; i++) { 
   
      key = "mykey" + i;
      value = "myvalue" + i;
      map.put(key, value);
    }

keySet 与 Iterator

    long startTime1 =System.currentTimeMillis();
    Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()){ 
   
      key=iter.next();
      value=map.get(key);
    }
    long endTime1 =System.currentTimeMillis();
    System.out.println("Run:"+(endTime1-startTime1)+"ms KeySet && Iterator");

keySet 与 for-loop

    long startTime2 =System.currentTimeMillis();
    for(String key2:map.keySet()){ 
   
      value=map.get(key2);
    }
    long endTime2 =System.currentTimeMillis();
    System.out.println("Run:"+(endTime2-startTime2)+"ms KeySet && For-Loop");

Map.Entry<K,V> 与 Iterator

    long startTime3=System.currentTimeMillis();
    Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
    Map.Entry<String,String> entry3;
    while (iter3.hasNext()){ 
   
      entry3 = iter3.next();
      key = entry3.getKey();
      value=entry3.getValue();
    }
    long endTime3 =System.currentTimeMillis();
    System.out.println("Run:" +(endTime3-startTime3)+"ms Map.Entry && Iterator");

Map.Entry<K,V> 与 for-loop

    long startTime4=System.currentTimeMillis();
    for(Map.Entry<String,String> entry4:map.entrySet()){ 
   
      key=entry4.getKey();
      value=entry4.getValue();
    }
    long endTime4 =System.currentTimeMillis();
    System.out.println("Run:"+(endTime4-startTime4) +"ms Map.Entry && For-Loop");

效率比较

以下运行时间单位为毫秒(ms)

Key数量 Entry && Iterator Entry && For-Loop KeySet && Iterator KeySet && For-Loop
10000(1w) 2 1 3 2
100000(10w) 8 6 10 8
1000000(100w) 38 32 39 36
10000000(1000w) 236 251 316 319

对比结论

多次验证,上述结果变化基本不大。使用Map.Entry<K,V>与for循环的组合是最有效率的

Map常用方法

Set<K> keySet()
Collection<V> values()
V get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
V getOrDefault(Object key, V defaultValue)

Java8 Map的遍历使用了新的方式forEach,这个函数就非常方便了,但是forEach中的值k,v是不可变的,在Java中是final的,这样就无法将k,v赋值给外部的变量了。如果一定要修改外部的值,需要用一个初值来累加/减/乘/除等操作

    Map<String, String> map = new HashMap<>();
    String key, value;
    int num = 10;
    for (int i = 1; i <= num; i++) { 
   
      key = "mykey" + i;
      value = "myvalue" + i;
      map.put(key, value);
    }

    map.forEach((k, v) -> { 
     // 非常方便
      System.out.println(k + ":" + v);
    });

把一个Map全部放到另外一个Map中

void putAll(Map<? extends K,? extends V> m)

删除一个键值对

boolean remove(Object key)

替换一个键值对

boolean	replace(K key, V oldValue, V newValue)

替换Map中所有Entry的value值,这个值由旧的key和value计算得出

void replaceAll(BiFunction<? super K,? super V,? extends V> function)

参考

  1. Map-Javadoc
  2. Map遍历效率比较
  3. 遍历HashMap的几种方式及其效率比较,HashMap删除元素时如何处理
  4. Java中HashMap的四种遍历方法,及效率比较
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126148.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一步一步画战车(雷电3接口)

    在用EXCEL做量化分析的时候,经常需要通过一些金融数据平台的API接口,获取各种数据。最常用的公共API接口有YahooFinance,GoogleFinance,新浪财经,搜狐财经等。这些都不需要注册,就可以直接使用。获取方式相对简单,但数据种类不够丰富,通常只包括交易数据和财务数据。另外一些免费的金融数据平台,如国外的Quandl和国内的Tushare也都提供了API接口,数据种类更…

    2022年4月10日
    119
  • Mybatis-plus操作json字段实战

    Mybatis-plus操作json字段实战后端动态列设计与实现三部曲,这是最后一步,使用java语言,结合mybatis-plus神技操作json字段。简单介绍下mybatis-plus,大厂中mybatis使用的非常多,而mybatis-plus是基于mybatis做了扩展,进一步增强,在不影响数据存储的情况下,简化操作方式。有兴趣的朋友可以去官网了解:https://www.baomidou.com/1、架构图2、功能3、表结构DROPTABLEIFEXISTSuser;CREATETABLEuser(……

    2025年6月22日
    0
  • map怎么转json对象_json怎么获取map

    map怎么转json对象_json怎么获取map如何把JSON对象转为map对象呢?JSON对象保存在大括号内。就像在JavaScript中,对象可以保存多个键/值对。Map对象保存键/值对,是键/值对的集合。任何值(对象或者原始值)都可以作为一个键或一个值。Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应。javascript将JSON对象转为map对象可以利用阿里巴巴封装的FastJSON来转换。有多种…

    2022年8月23日
    6
  • HttpClient使用详解

    HttpClient使用详解Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。一、简介HttpClient是ApacheJakartaCommon下的子项目,用来提供高效的

    2022年7月22日
    8
  • 详解java接口interface

    详解java接口interface引言接口这个词在生活中我们并不陌生。在中国大陆,我们可以将自己的家用电器的插头插到符合它插口的插座上;我们在戴尔,惠普,联想,苹果等品牌电脑之间传输数据时,可以使用U盘进行传输。插座的普适性是

    2022年7月2日
    22
  • Python range 函数 – Python零基础入门教程

    Python range 函数 – Python零基础入门教程目录一.Pythonrange函数简介二.Pythonrange函数使用1.Pythonrange函数常规使用2.Pythonrange函数在for循环中使用三.猜你喜欢

    2022年7月5日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号