Map 中的 keySet() 和 entrySet() 区别

遍历 Map 输出键值对有俩种方法。

比较常用的 keySet():

HashMap<String,String> hm = new HashMap<String,String>();
		hm.put("name", "pioneer");
		hm.put("age", "12");
       for( String s : hm.keySet()){
    	   System.out.println(s + " : " + hm.get(s));
       }

 

entrySet():

HashMap<String,String> hm = new HashMap<String,String>();
		hm.put("name", "pioneer");
		hm.put("age", "12");
       for( Entry e : hm.entrySet()){
    	   System.out.println(e.getKey() + " : " + e.getValue());
       }

 

  1. Set<K> keySet()  :返回值是个只存放 key 值的 Set 集合(集合中无序存放的),迭代后只能通过 get() 取key。
  2. Set<Map.Entry<K,V>> entrySet() : 返回映射所包含的映射关系的 Set 集合(一个关系就是一个键-值对),就是把( key-value )作为一个整体一对一对地存放到 Set 集合当中的。迭代后可以 e.getKey(),e.getValue() 取 key 和 value 。返回的是 Entry 接口。

 

性能辟谣

网上很多资料说 : keySet() 的速度比 entrySet() 慢了很多,也就是 keySet 方式遍历 Map 的性能不如 entrySet 性能好,为了提高性能,以后多考虑用 entrySet() 方式来进行遍历。

但实践是检验真理的唯一标准。

 

HashMap<String,String> hm = new HashMap<String,String>();
		for(int i = 0; i <= 1000000; i++){
			hm.put("name" + i, "pioneer" + i);
		}
		
		long startTime0 = System.currentTimeMillis();
      for( String s : hm.keySet()){
    	   System.out.println(s + " : " + hm.get(s));
       }
    
      long ktime = System.currentTimeMillis() - startTime0;
       
       long startTime1 = System.currentTimeMillis();
       for( Entry e : hm.entrySet()){
    	   System.out.println(e.getKey() + " : " + e.getValue());
       }
       long etime = System.currentTimeMillis() - startTime1;
       System.out.println("keySet use : " + ktime);
       System.out.println("entrySet use : " + etime);

上面的代码运行结果是:

我们换成另外一种遍历方式:

HashMap<String, String> keySetMap = new HashMap<String, String>();     
        HashMap<String, String> entrySetMap = new HashMap<String, String>();   
        for (int i = 0; i < 1000000; i++) {     
            keySetMap.put("" + i, "keySet");     
        }     
        for (int j = 0; j < 1000000; j++) {     
            entrySetMap.put("" + j, "entrySet");     
        }   
        //keySet实验:1000000条数据,用时 
        long startTimeOne = System.currentTimeMillis();     
        Iterator<String> keySetIterator = keySetMap.keySet().iterator();     
        while (keySetIterator.hasNext()) {     
            String key = keySetIterator.next();     
            String value = keySetMap.get(key);    
            System.out.println(value);     
        }     
        long value = System.currentTimeMillis() - startTimeOne;
        
        //entrySet实验:1000000条数据,用时  
        long startTimeTwo = System.currentTimeMillis();     
        Iterator<Entry<String, String>> entryKeyIterator = entrySetMap     
                .entrySet().iterator();     
        while (entryKeyIterator.hasNext()) {     
            Entry<String, String> e = entryKeyIterator.next();     
            System.out.println(e.getValue());     
        }
        System.out.println("keyset spent times:"    
                + value);   
        System.out.println("entrySet spent times:"    
                + (System.currentTimeMillis() - startTimeTwo)); 

 

运行结果是:

 

我们可以看到,entrySet 并没有比 keySet 方法遍历快。笔者的 jdk 版本是 1.7 ,据笔者推断网上居多的 entrySet 性能比 keySet 好是因为之前低版本的时候是这样,但现在 java 开发团队优化了 keySet ,所以俩者的性能没有多大区别

 

2021.3.3更新---

entrySet的性能确实更好,可看如下:https://stackoverflow.com/questions/3870064/performance-considerations-for-keyset-and-entryset-of-map

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值