Map遍历KeySet()和EntrySet的性能差异与源码解析



Set<Entry<String, String>>entrySet = map.entrySet();

Set<String> set = map.keySet();`

上面就是我们经常用Map进行遍历的两种方式,在此对比一下两者的区别

在此我们看一下源码解析:

keySet:get方式和getEntry方式的比较

 public V get(Object key) {
        if (key == null)
            return getForNullKey();
        Entry<K,V> entry = getEntry(key);

        return null == entry ? null : entry.getValue();
    }    
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
final Entry<K,V> getEntry(Object key) {
        if (size == 0) {
            return null;
        }

        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }
从上面两个方式的可以看出

使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。

说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出 key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。

正例:values()返回的是V值集合,是一个list集合对象;keySet()返回的是K值集合,是一个Set集合对象;entrySet()返回的是K-V值组合集合。

例子:第一种

Set<Entry<String, String>>entrySet = map.entrySet();Set<String> set = map.keySet();`

Map map = new HashMap(); 

Iterator iter = map.entrySet().iterator(); 

while (iter.hasNext()) { 

    Map.Entry entry = (Map.Entry) iter.next(); 

    Object key = entry.getKey(); 

    Object val = entry.getValue(); 

效率高,以后一定要使用此种方式! 

例子:第二种 

Map map = new HashMap(); 

Iterator iter = map.keySet().iterator(); 

while (iter.hasNext()) { 

    Object key = iter.next(); 

    Object val = map.get(key); 

效率低,以后尽量少使用! 


Tips:对于两种遍历方式我们构造代码的时候一定要注意,一定要写出高质量的代码是我们毕生追求,写出艺术感,使命感,下面想说一下阿里Java开发手册的注意Map类集合K/V能不能存储null值的情况,如下表格:


集合类

Key

Value

Super

说明

Hashtable

不允许为null

不允许为null

Dictionary

线程安全

ConcurrentHashMap

不允许为null

不允许为null

AbstractMap

锁分段技术(JDK8:CAS

TreeMap

不允许为null

允许为null

AbstractMap

线程不安全

HashMap

允许为null

允许为null

AbstractMap

线程不安全

反例: 由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上,存储 null 值时会抛出 NPE 异常。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值