遍历map的几种方法(面试资料准备,转人家的资料)

转载来源于https://blog.csdn.net/a745233700/article/details/83025222

遍历map的几种方法
遍历map的方式有三种: keySet方式,entrySet方式,value()取值的方式,三者都有对应的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接口;

遍历的性能对比:
前面的代码的输出结果如下:

1 keySet的for循环遍历方式耗时:41822微秒
2 keySet的Iterator遍历方式耗时:36073微秒
3 entrySet的for循环遍历方式耗时:31792微秒
4 entrySet的Iterator遍历方式耗时:25888微秒
5 values()方法的for循环遍历方式耗时:25264微秒
6 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循环效率更快一点。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值