java map集合如何遍历效率高 java中Map遍历的方式_HaHa_Sir的博客-程序员宝宝_java map遍历

技术标签: Java  java中Map遍历的方式  Map集合 遍历效率比较  java map遍历迭代方法  Map遍历效率比较  java map遍历效率高  

                             java map集合如何遍历效率高 java中Map遍历的方式

 

一、前言

1、在看 《阿里巴巴java开发手册》时候,有一条推荐的规约: 【推荐】使用entrySet遍历Map类集合KV而不是keySet方式进行遍历。 说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。 ---- 那么如何理解那一段话呢? map 集合如何遍历效率高?

 

 

二、Map集合的遍历

1、根据 key 找 value

  • 获取所有的 key 集合。 map.keySet() 
  • 遍历 key 集合。

  • 根据 key 到集合中去找 value 。 map.get(key)

 

2、根据 key--value 键值对 找键和值

  • 获取所有的 key--value键值对集合。 map.entrySet()
  • 遍历键值对集合,获取每一个键值对对象。
  • 根据键值对对象,获取 key 键 和 value 值。 entry.getKey(); entry.getValue();

 

3、遍历values 值对象: map.values();

 

三、代码实现

1、 遍历测试代码如下:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.junit.Test;
/**
* description: 遍历Map集合效率比较
* @version v1.0
* @author w
* @date 2018年10月23日上午11:20:08
*/
public class ForeachMap {
    /**
    * description: 初始化map集合中元素
    * @param map
    * @version v1.0
    * @author w
    * @date 2018年10月23日 下午2:45:35
    */
    public void init(Map<Integer, String> map){
        // 初始化map集合中元素的个数
        int count = 1000000;
        for (int i = 1; i <= count; i++) {
            map.put(i, i+ " ---> map");
        }
    }

    @Test
    public void test(){
        Map<Integer, String> map = new HashMap<>();
        Map<Integer, String> map2 = new HashMap<>();
        long start = System.currentTimeMillis();
        init(map);
        init(map2);
        System.out.println("装载map耗时: "+(System.currentTimeMillis()-start)+ " ms");

        start = System.currentTimeMillis();
        foreachKeyset(map);
        System.out.println("foreachKeyset 遍历 map耗时: "+(System.currentTimeMillis()-start)+ " ms");
    
        start = System.currentTimeMillis();
        foreachEntry(map2);
        System.out.println("foreachEntry 遍历 map耗时: "+(System.currentTimeMillis()-start)+ " ms");

        start = System.currentTimeMillis();
        iteratorEntry(map2);
        System.out.println("iteratorEntry 遍历 map耗时: "+(System.currentTimeMillis()-start)+ " ms");
        System.out.println(map.size());
    }

    /**
    * description: 根据 key 找 value
    * @param map
    * @version v1.0
    * @author w
    * @date 2018年10月23日 下午5:10:01
    */
    private void foreachKeyset(Map<Integer, String> map) {
        for(Integer key : map.keySet()){
            String value = map.get(key);
            // System.out.println("foreachKeyset : key :" + key + "---> value :"+ value);
        }
    }

    /**
    * description: 根据 key--value 键值对 找键和值 ( foreach 遍历)
    * @param map
    * @version v1.0
    * @author w
    * @date 2018年10月23日 下午5:19:31
    */
    private void foreachEntry(Map<Integer, String> map) {
        for(Entry<Integer, String> entry : map.entrySet()){
        // System.out.println("foreachEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
        }
    }

    /**
    * description: 根据 key--value 键值对 找键和值 ( iterator 遍历)
    * @param map
    * @version v1.0
    * @author w
    * @date 2018年10月23日 下午5:19:01
    */
    private void iteratorEntry(Map<Integer, String> map) {
        Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
        while(iterator.hasNext()){
            Entry<Integer, String> entry = iterator.next();
            // System.out.println("iteratorEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
        }
    }

}

 

2、运行结果:

装载map耗时: 2705 ms

foreachKeyset 遍历 map耗时: 44 ms

foreachEntry 遍历 map耗时: 22 ms

iteratorEntry 遍历 map耗时: 17 ms

1000000

 

四、总结

1、遍历 map 集合时,应该同时遍历出 键值对,这样效率更高。

2、若遍历过程中,需要根据条件删除集合中元素,参考:https://blog.csdn.net/HaHa_Sir/article/details/80295755

 

 

 

参考资料: https://blog.csdn.net/zhangsify/article/details/52966094#commentBox

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HaHa_Sir/article/details/83310848

智能推荐

leetcode-测试用例自动转化为sql_Not Talk的博客-程序员宝宝

最近在刷leetcode的数据库的时候,发现测试用例不能生成sql语句,手动的建表,可能自己的水平很菜,慢慢练习吧,于是花了几个小时写了个脚本,自动生成sql语句,废话不多说,直接上干货.一:怎么使用必须有油猴管理器吧(如果不知道什么是油猴管理器,自行百度)找到我这个插件,点击安装即可必须有leetcode这个账号吧.二:功能介绍若发现自己的sql语句通不过,跳转到详...

(自然语言处理文档系列)Penn Treebank词性标记集_BjutHz的博客-程序员宝宝

在进行自然语言处理时,常见的任务是对单词进行词性标注,但对于标注的结果我们有时候不是很明白,文章介绍了对于常见的标注结果的中文含义。编号 缩写 英文 中文1 CC Coordinating conjunction 并列连接词2 CD Cardinal number 基数3 DT Determiner

ipconfig和自己配置的IP不一样,自己ping不通自己_不然秋月春风夜的博客-程序员宝宝_自己ping不通自己

今天配完IP发现,和自己的ipconfig竟然不一致,并且自己ping不通自己。后来发现这个IP的169.254.x.x 这个字段,是Microsoft自己的保留IP字段,是在没有IP资源的时候,自己生成的一个IP.最后发现是自己的IP和别人的冲突了,所以导致了该问题。所以需要重新更换一个新的IP,在重新!配置下,就可以了。...

论文笔记:FCN_hongbin_xu的博客-程序员宝宝

原文:Fully Convolutional Networks for Semantic SegmentationFCN1、四个问题要解决什么问题?语义分割。用了什么方法解决?提出了“全卷积神经网络”,可以接收任意尺寸的输入,并给出对应大小的输出。使用一些图像分类模型(如:AlexNet、VGG、GoogLeNet)等做迁移学习。使用skip architecture的...

HDU 5780 (欧拉函数)_morejarphone的博客-程序员宝宝

题目链接:点击这里题意: 求∑na=1∑nb=1gcd(xa−1,xb−1)\sum_{a=1}^n\sum_{b=1}^ngcd(x^a-1,x^b-1).因为gcd(xa−1,xb−1)=xgcd(a,b)−1gcd(x^a-1, x^b-1)=x^{gcd(a,b)}-1, 然后就是计算所有的gcd(a,b)gcd(a,b)的值对答案的贡献, 最后减去n2n^2个1. 如果用f[i]f[i]表

【OpenGL】绘制表情并实现二维基本变换:平移、旋转、缩放_敲代码两年半的练习生的博客-程序员宝宝

【OpenGL】绘制表情并实现二维基本变换:平移、旋转、 缩放1.绘制目标2.核心代码2.1 绘制圆面2.2 绘制圆弧2.3 绘制脸蛋2.4 键盘操作3.全部代码4.运行结果1.绘制目标二维基本变换:平移、旋转、缩放• glTranslate*()• glRotate*()• glScale*()• 小提示:对圆盘进行三角化,然后基于GL_TRIANGLE_FAN绘制。2.核心代码2.1 绘制圆面/// &lt;summary&gt;/// 绘制圆面/// &lt;/summar

随便推点

vue 页面禁止物理返回键返回跳转相应页面 App 浏览器通用_ppfxdj的博客-程序员宝宝

mounted () { if (window.history &amp;&amp; window.history.pushState) { history.pushState(null, null, document.URL) window.addEventListener('popstate', this.goBack, false) } },methods: {goBack () {

【转】Win7程序自启动_SugarBaiTu的博客-程序员宝宝

1、添加应用程序到操作系统自动中,只需要把应用程序的快捷方式复制到开始菜单的启动项目下即可。(1)鼠标单击“开始菜单”-“所有程序”,鼠标选择“启动”,左击后选择“打开所有用户”,如下图:(2)把需要的应用程序快捷方式拖动到“启动”目录下即可,详细路径点击“程序”右边的箭头即可。2、(1)点击“开始”,在“开始搜索”框中输入“msconfig

Android开发笔记(一百五十六)通过渲染纹理展示地球仪_aqi00的博客-程序员宝宝

上一篇文章介绍了如何使用GL10描绘三维物体的线段框架,后面给出的立方体和球体效果图,虽然看起来具备立体的轮廓,可离真实的物体还差得远。因为现实生活中的物体不仅仅有个骨架,还有花纹有光泽(比如衣服),所以若想让三维物体更加符合实际,就得给它加一层皮,也可以说是加一件衣服,这个皮毛大衣用OpenGL的术语称呼则为“纹理”。三维物体的骨架是通过三维坐标系表示的,每个点都有x、y、z三个方向上的数值大小

http文件服务器下载接口中文,特殊字符问题_吾已六的博客-程序员宝宝

http文件服务器文件下载接口特殊字符及乱码问题1.Content-Disposition作用http文件的服务器下载文件的文件名判断是根据 Content-Disposition来识别。2.Content-Disposition编解码问题:网上搜索解决方法及RFC规范发现Content-Disposition应该采用如下格式:Content-Disposition:attachment;

WebSphere在Linux操作系统下的性能优化_TPCloud的博客-程序员宝宝

IBM WebSphere Application Server作为企业级的中间件,在众多大公司及企业提供应用支撑服务,为实现应用程序的高效快速运行,系统的调优操作必不可少,下面将针对安装在Linux下的websphere的操作系统层面优化进行详解:1,更改 TCP 参数 描述: Linux 提供了许多可调 TCP 参数,其缺省值对于 WebSphere Application Server 来说可能就足够了。在某些例外情况下,可能必须调整这些参数。例如,您可能会减少特定状态(例如,TI...

在编写R语言代码时,怎样高效使用Sublime Text等编辑器_蛐蛐蛐的博客-程序员宝宝

这篇日志很简单,因为我对R很不熟悉,总共就写过不超过300行代码。但是可能别的初学者朋友也会遇到类似的问题,所以还是简单总结一下:R是非常好的统计、机器学习、大数据分析工具(Revolution Analytics这个公司2015年1月刚刚被微软收购),但是其自带的编辑器功能太过于简单了,连代码高亮都没有,偶尔用一下还可以忍受,用多了实在受不了。这时候就想求助于Sublime Te

推荐文章

热门文章

相关标签