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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Kong Api 初体验

    Kong Api 初体验转载请标明出处:https://blog.csdn.net/forezp/article/details/79383631本文出自方志朋的博客Kong是一个可扩展的开源API层(也称为API网关或API中间件)。Kong运行在任何RESTfulAPI的前面,并通过插件扩展,它们提供超出核心平台的额外功能和服务。Kong最初是在Mashape建立的,用于为其AP…

    2022年6月26日
    21
  • python超链接格式_Openpyxl中的超链接样式「建议收藏」

    python超链接格式_Openpyxl中的超链接样式「建议收藏」4个答案:答案0:(得分:1)importopenpyxlfromopenpyxl.stylesimportFont,Color,colors#…#alternative1:sethyperlinkpropertytocelldeflink_1(cell,link,display=None):cell.hyperlink=linkcell.font=…

    2022年7月19日
    109
  • 查看端口常用命令以及关闭端口的方法

    查看端口常用命令以及关闭端口的方法dos命令行查询端口常用命令在windows命令行窗口下执行:运行–cmd–netstat-a显示所有活动的TCP连接以及计算机监听的TCP和UDP端口。netstat-e显示以太网发送和接收的字节数、数据包数等。netstat-n以数字形式显示所有活动的TCP连接的地址和端口号。netstat-o显示活动的TCP连接并包括每个连接的进程ID(PID)。netstat-s按协议显示

    2022年7月20日
    33
  • Iterator 和 Iterable 差别和联系「建议收藏」

    Iterator 和 Iterable 差别和联系

    2022年1月21日
    36
  • SBC应用「建议收藏」

    SBC应用「建议收藏」在VoIP呼叫中主要使用会话发起协议(SIP),H.323和MGCP呼叫信令协议,Sbc在主叫和被叫的信令/媒体路径之间引入。通常,SBC隐藏网络拓扑,接管呼入并生成到新的请求分支到被叫。技术上叫做背靠背B2BUA;这样做的好处是信令流和媒体流都能得到SBC控制。方便处理录音、生成保持背景音乐等媒体相关的处理;假如SBC不具备媒体服务的处理能力,也能够转发媒体流…

    2022年9月3日
    2
  • linux镜像文件没有gho,【iso文件中没有gho文件】iso变gho_iso文件里没有gho-系统城…

    linux镜像文件没有gho,【iso文件中没有gho文件】iso变gho_iso文件里没有gho-系统城…2016-05-0119:20:51  浏览量:6833gho文件是ghost系统的克隆镜像,存储着系统分区的所有文件信息,可用于安装系统,有些U盘安装方法需要把ISO镜像中的gho文件拷贝到U盘,那么gho文件在哪里呢?ISO镜像中的gho文件是哪个呢?下面系统城小编就跟大家分析一下。2016-03-0319:44:18  浏览量:18623使用U盘pe启动盘安装系统时,只需把系统gho映像…

    2022年7月12日
    13

发表回复

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

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