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");}}@Testpublic 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

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

  1. 面试题7: 二叉树基础知识 - 前序遍历(DLR), 中序遍历(LDR), 后续遍历(LRD) - Android 端递归实现

    二叉树定义: /*** Author: Heynchy* Date: 2019/6/24* <p>* Introduce: 二叉树的定义*/ public class TreeNode i ...

  2. Morris遍历算法 树的中序遍历

    Morris遍历算法 树的中序遍历 树的中序遍历 一.普通方法 1.递归实现 2.栈实现 二.Morris遍历 1.算法 2.代码 总结 树的中序遍历 对于当前结点,先输出它的左孩子,然后输出该结点, ...

  3. 已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是

    已知二叉树后序遍历序列是DABEC 中序遍历列是 DEBAC ,它的前序遍历序列是: ----C ---/ --E -/-\ D---B -----\ ------A 我知道答案思念是这个....我想 ...

  4. Java基础---集合的概述---list、set、map、泛型、collections

    集合的概述 单列集合的体系: Collection 单列集合的顶层接口 List Collection的子接口,增加了一些特有的方法,有序 可以重复 有索引 ArrayList 底层采用的数组结构实现 ...

  5. JAVA对象集合转化为xml转换_xml转为Map集合以及对象转化为xml

    1.[代码][Java]代码 package com.fang.util; import java.io.InputStream; import java.util.HashMap; import j ...

  6. java set遍历删除元素_java中循环遍历删除List和Set集合中元素的方法

    今天在做项目时,需要删除List和Set中的某些元素,当时使用边遍历,边删除的方法,却报了以下异常: ConcurrentModificationException 为了以后不忘记,使用烂笔头把它记录 ...

  7. java的map键值类型是否固定_Java中Map根据键值(key)或者值(value)进行排序实现

    我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...

  8. php 遍历 效率高,PHP遍历数组的三种方法及效率对比分析

    这篇文章主要介绍了PHP遍历数组的三种方法及效率对比,实例分析了foreach.while与for三种遍历数组的方法与相关的效率比对,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例分析了PHP遍 ...

  9. Golang——map集合初始化、键值操作、map作为函数参数的使用

    map是一种无序的键值对集合,键是不允许重复的,map是通过hash实现的 map最重要的一点是通过key来快速检索数据,key类似于索引,指向数据的值 引用类型不能作为key map的创建: 格式1 ...

  10. c++ map是有序还是无序的_c++中map与unordered_map的区别

    map: 优点: 有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作 红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高 缺点 ...

最新文章

  1. Asp.Net MVC 自定义的MVC框架(非EF操作数据库)
  2. NOIP2013Day1T3 表示只能过一个点
  3. C# 系统应用之窗体最小化至任务栏及常用操作
  4. 160 - 15 blaster99.exe
  5. 合并两个数组并去重(ES5和ES6两种方式实现)
  6. crossin的编程教室python入门_简单三步,用 Python 发邮件
  7. ssh (安全外壳协议)Secure Shell 百度百科
  8. c语言 callback回调函数
  9. zabbix详解(十三)——zabbix微信报警实战
  10. 【优化调度】基于matlab遗传算法求解码头泊位分配调度优化问题【含Matlab源码 247期】
  11. 财富自由之路-博多费舍尔
  12. Oracle数据库常用Sql语句大全
  13. 蓝屏代码0x000009f
  14. 9.0 OTA升级logo不更新,输入法不更新
  15. 一文详解基因组denovo组装原理和实战
  16. 计算机用户组连接打印机,工作组链接域内共享打印机的正确姿势
  17. AI遮天传 ML-KNN
  18. div背景图片完整填充样式设置---background、background-size、background-attachment
  19. Windows中HWND定义说明
  20. Win10 禁止自动更新以及禁止Windows 10升级助手(Windows 10 易升)

热门文章

  1. c语言中以e为底的指数怎么表示,c++中怎样表示以e为底的
  2. 百度云OCR文字识别
  3. DS18B20调试总结
  4. office2016卸载
  5. 在excel中如何筛选重复数据_如何将Excel重复数据筛选出来?简单技巧有三种!...
  6. OC 6702升压型恒流驱动芯片, ESOP8 封装,内置 100V 功率 MOS
  7. 如何让html页面缩小时不打乱,如何让表格快速打乱
  8. thuwc2019滚粗记
  9. 将公式插入WPS/Word中
  10. S32K144(19)FlexIO