zoukankan      html  css  js  c++  java
  • Java中的HashMap的2种遍历方式比较

    首先我们准备数据,准备一个map

    Map<String, String> map = new HashMap<String, String>();  
    for (int i = 0; i < 10; i++) {  
        map.put(i + "", "value" + i);  
    }

    然后我们采用传说中的key遍历: 步骤:先弄成key set,然后遍历key set 通过key从map中获取value

    Iterator<String> iterator = map.keySet().iterator();  
    while (iterator.hasNext()) {  
        String key = iterator.next();  
        String val = map.get(key);  
        System.out.println(key + "->" + val);  
    }  
    System.out.println("*********************");

    然后我们在采用entrySet的方式遍历下:

    步骤:先弄成entrySet 然后遍历他,获取key和value

    Set<Entry<String, String>> set = map.entrySet();  
    Iterator<Entry<String, String>> s = set.iterator();  
    while (s.hasNext()) {  
        Entry<String, String> en = s.next();  
        String key = en.getKey();  
        String val = en.getValue();  
        System.out.println(key + "->" + val);  
    }

    孰优孰劣? 看JDK源码,对比两种访问方式:

    首先看KeySet访问方式:

    public Set<K> keySet() {  
    if (keySet == null) {  
        keySet = new AbstractSet<K>() {  
        public Iterator<K> iterator() {  
            return new Iterator<K>() {  
            private Iterator<Entry<K,V>> i = entrySet().iterator();  
    
            public boolean hasNext() {  
                return i.hasNext();  
            }  
    
            public K next() {  
                return i.next().getKey();  
            }  
    
            public void remove() {  
                i.remove();  
            }  
                       };  
        }  
        public int size() {  
            return AbstractMap.this.size();  
        }  
    
        public boolean contains(Object k) {  
            return AbstractMap.this.containsKey(k);  
        }  
        };  
     }  
    return keySet;  
    }

    也就是调用entrySet()从entryset中获取key,也就是说是在entry set的基础上来做的,貌似多次一举

    结论:

    通过上述代码我们就知道,采用entrySet方式要优于keySet,因为keySet首先要访问entrySet来组建一个keySet,重复工作不言而喻。

    所以使用entrySet的效率更高些,或许很多时候我们都不太注意这些,但是从源码中就可以得到答案了。

    http://outofmemory.cn/code-snippet/1508/HashMap-2-zhong-bianli-mode-match

  • 相关阅读:
    Leetcode888. 公平的糖果棒交换
    Leetcode81. 搜索旋转排序数组 II
    Leetcode80. 删除排序数组中的重复项 II
    Leetcode1631. 最小体力消耗路径
    Leetcode57. 插入区间
    Leetcode724. 寻找数组的中心索引
    Leetcode18. 四数之和
    Leetcode110. 平衡二叉树
    Leetcode1128. 等价多米诺骨牌对的数量
    python 集合和深浅copy
  • 原文地址:https://www.cnblogs.com/itommy/p/10610338.html
Copyright © 2011-2022 走看看