Java集合篇:Map常用遍历方式 以及 性能对比

Java集合篇:Map常用遍历方式 以及 性能对比

一、Map集合常用的遍历方式:

遍历Map集合的常用方式有三种:使用keySet的方式,使用entrySet的方式,使用values()取值的方式,这三种方式中,都有对应的for循环遍历和Iterator遍历的方式取值。

具体用法如下:

public class MapTest {

	public static void main(String[] args) {
		HashMap<Integer,String> map= new HashMap<Integer,String>();
		for(int i = 0;i < 1000000;i++){
			map.put(i, "第"+i+"个元素");
		}
		
		//第一种方式:keySet的for循环遍历方式
		long time1 = System.nanoTime();
		for(Integer key : map.keySet()){
			map.get(key);
		}
		long time2 = System.nanoTime();

		//第一种方式:keySet的Iterator遍历方式
		Iterator<Integer> iterator = map.keySet().iterator();
		while(iterator.hasNext()){
			Integer key = iterator.next();
			map.get(key);
		}
		long time3 = System.nanoTime();
		
		//第二种方式:entrySet的for循环遍历方式
		for(Entry<Integer,String>  entry: map.entrySet()){
			entry.getKey();
			entry.getValue();
		}
		long time4 = System.nanoTime();
		
		//第二种方式:entrySet的Iterator遍历方式
		Iterator<Entry<Integer, String>> iterator2 = map.entrySet().iterator();
		Entry<Integer, String> entry;
		while(iterator2.hasNext()){
			entry = iterator2.next();
			entry.getKey();
			entry.getValue();
		}
		long time5 = System.nanoTime();
		
		//第三种方式:只能得到value,可以用values()返回包含所有value的Collection<T>,不容易得到对应的key
		//values()方法的for循环遍历方式
		Collection<String> values = map.values();
		for(String value : values){
			
		}
		long time6 = System.nanoTime();
		
		//values()方法的Iterator遍历方式
		Iterator<String> iterator3 = map.values().iterator();
		String value;
		while(iterator3.hasNext()){
			value=iterator3.next();
		}
		long time7 = System.nanoTime();
		
		System.out.println("keySet的for循环遍历方式耗时:" + (time2-time1)/1000 + "微秒");
		System.out.println("keySet的Iterator遍历方式耗时:" + (time3-time2)/1000 + "微秒");
		System.out.println("entrySet的for循环遍历方式耗时:" + (time4-time3)/1000 + "微秒");
		System.out.println("entrySet的Iterator遍历方式耗时:" + (time5-time4)/1000 + "微秒");
		System.out.println("values()方法的for循环遍历方式耗时:" + (time6-time5)/1000 + "微秒");
		System.out.println("values()方法的Iterator遍历方式耗时:" + (time7-time6)/1000 + "微秒");
	}
}

keySet是键的集合,Set里面的类型即key的类型;

entrySet是键-值对的集合,Set里面的类型是Map.Entry,Entry是一个键-值对;

keySet():迭代后只能通过get()取key;

entrySet():迭代后可以e.getKey(),e.getValue()取key和value,返回的是Entry接口;

 

二、遍历的性能对比:

前面的代码的输出结果如下:

keySet的for循环遍历方式耗时:41822微秒
keySet的Iterator遍历方式耗时:36073微秒
entrySet的for循环遍历方式耗时:31792微秒
entrySet的Iterator遍历方式耗时:25888微秒
values()方法的for循环遍历方式耗时:25264微秒
values()方法的Iterator遍历方式耗时:21215微秒

从上面的输出结果可以看出:

1、在数据元素的数量比较大时,entrySet()方式的遍历效率快于keySet(),有两个原因 :

(1)一个原因是keySet相当于遍历了2次,一次是对key的Set集合的遍历,二次是每次遍历过程都要通过key和map.get(key)来获取value值。

(2)第二个原因是map.get(key)的时候,底层是根据key的hashCode值经过哈希算法得到一个hash值,然后作为索引映射到对应的table数组的索引位置,这是一次密集型计算,很耗费CPU,如果有大量的元素,则会使CPU使用率飙升,影响响应速度,而entrySet()返回的set里面的元素都是Map.Enpty类型,key和value就是这个类的一个属性,entry.getKey()和entry.getValue()效率肯定很高。

2、不过,在数据元素的数量比较小的情况小,keySet()方式的遍历效率快于entrySet()。

3、values()是返回Map的所有value的集合的Collection,只能遍历到value,很难遍历到key,所以一般不用,如果当我们只需要取得value值时,采用values来遍历效率更高。

4、从上面的几种方式的for循环遍历和Iterator遍历的方式耗时结果来看,Iterator遍历的效率会比for循环效率更快一点。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • 计算机存储容量1tb等于多少,1tb等于多少mb(1tb等于多少gb)

    计算机存储容量1tb等于多少,1tb等于多少mb(1tb等于多少gb)1TB等于多少MB和多少GB?是电脑的硬盘!谢谢!1GB=1024MB(理论上)计算机存储信息的大小,最基本的单位是字节,一个汉字由两个字节组成,字母和数字由一个字节组成。容量的单位从小到大依次是:字节(B.1TB等于1024G。TB:太字节(Terabyte),计算机存储容量单位,也常用TB来表示。GB:吉字节(GB、Gigabyte,在中国又被称为吉咖字节或京字节或十亿字节或戟).1TB=…

    2022年5月25日
    120
  • NOIP2008_2012年12月16号农历是

    NOIP2008_2012年12月16号农历是NOIP2012DAY1T1Vigenère密码纯模拟#include<bits/stdc++.h>chara[105],b[1005],ans[1005];intlen1,len2,h=1,p;intc[105];usingnamespacestd;intmain(){// freopen(“vigenere.in”,”r”,stdin); …

    2022年8月22日
    6
  • 史上最全Java多线程面试题及答案[通俗易懂]

    史上最全Java多线程面试题及答案[通俗易懂]这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 1、多线程有什么用?一个可能在很多人看来…

    2022年8月27日
    6
  • 考研经验-东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道)

    考研经验-东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道)(记录了2020考研的一些经历和自己的想法,有兴趣可看一下)考研结束后,一直想记录下自己的经历,因为各种原因,直到今天才终于动手。关于本人考研过程中整理的关于基础课和专业课的思维导图笔记,可查看本人博客:本文大概内容:一、考研相关问题1.考研前准备先说说考研之前的准备吧。若你尽早确定了考研的思想,别犹豫,越早复习越好。我想不出有什么理由,对于同一个人而言,复习时间长会比时间短的效果差。当然网上有太多人建议适当的时间就好,不用太长时间,依然考了很理想的学校。但是,你只看到了别人的成功

    2022年10月20日
    2
  • 用webBrowser打开网页出现脚本错误怎么办

    当IE浏览器遇到脚本错误时,在浏览器左下角会出现一个黄色图标,点击可以查看脚本错误的详细信息,并不会有弹出的错误信息框。我们在用webBrowser编写的程序打开网页,遇到脚本有问题是,会弹出一个错误

    2021年12月27日
    40
  • 一个不简单的Procedure body例子

    一个不简单的Procedure body例子1createorreplacepackagebodyCountBankData_20150617is2typecursorCommonisrefcursor;–游标类型3strSQLvarchar2(7000);–sql语句变量4strTemp…

    2022年9月19日
    2

发表回复

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

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