zoukankan      html  css  js  c++  java
  • 谨慎使用keySet:对于HashMap的2种遍历方式比较

     HashMap存储的是键值对,所以一般情况下其遍历同List及Set应该有所不同.

    但java巧妙的将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了HashMap的遍历处理,使其遍历同List、Set并无差异.

    第一种:

    Java代码 
    1. Map map = new HashMap();   
    2. Iterator iter = map.entrySet().iterator();   
    3. while (iter.hasNext()) {   
    4.     java.util.Map.Entry entry = (Map.Entry) iter.next();   
    5.     Object key = entry.getKey();   
    6.     Object val = entry.getValue();   
    7. }  

    第二种:

    Java代码 
    1. Map map = new HashMap();   
    2. Iterator iter = map.keySet().iterator();   
    3. while (iter.hasNext()) {   
    4.     Object key = iter.next();   
    5.     Object val = map.get(key);   
    6. }
     
     
    例如: 
      HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例: 
    Java代码 
    1. public class HashMapTest {   
    2.   
    3.   public static void main(String[] args) ...{   
    4.   
    5.   HashMap hashmap = new HashMap();   
    6.   for (int i = 0; i < 1000; i ) ...{   
    7.       hashmap.put("" i, "that's all");   
    8.   }   
    9.   long num = Calendar.getInstance().getTimeInMillis();   
    10.   Iterator iterator = hashmap.keySet().iterator();   
    11.   
    12.   while (iterator.hasNext()) ...{   
    13.       System.out.print(hashmap.get(iterator.next()));   
    14.   }   
    15.   System.out.println();   
    16.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);   
    17.   listHashMap();   
    18.   }   
    19.   public static void listHashMap() ...{   
    20.         java.util.HashMap hashmap = new java.util.HashMap();   
    21.     
    22.       for (int i = 0; i < 1000; i ) ...{   
    23.      hashmap.put("" i, "that's all");   
    24.   }   
    25.   long num = Calendar.getInstance().getTimeInMillis();   
    26.   java.util.Iterator it = hashmap.entrySet().iterator();   
    27.   while (it.hasNext()) ...{   
    28.   java.util.Map.Entry entry = (java.util.Map.Entry) it.next();   
    29.   // entry.getKey() 返回与此项对应的键   
    30.   // entry.getValue() 返回与此项对应的值   
    31.   System.out.print(entry.getValue());   
    32.   }   
    33.   System.out.println();   
    34.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);   
    35.   }   
    36.   } 
     
     

    看JDK源码,对比两种访问方式:

    首先看KeySet访问方式:

    Java代码 
    1.    public Set<K> keySet() {  
    2. if (keySet == null) {  
    3.     keySet = new AbstractSet<K>() {  
    4.     public Iterator<K> iterator() {  
    5.         return new Iterator<K>() {  
    6.         private Iterator<Entry<K,V>> i = entrySet().iterator();  
    7.   
    8.         public boolean hasNext() {  
    9.             return i.hasNext();  
    10.         }  
    11.   
    12.         public K next() {  
    13.             return i.next().getKey();  
    14.         }  
    15.   
    16.         public void remove() {  
    17.             i.remove();  
    18.         }  
    19.                    };  
    20.     }  
    21.   
    22.     public int size() {  
    23.         return AbstractMap.this.size();  
    24.     }  
    25.   
    26.     public boolean contains(Object k) {  
    27.         return AbstractMap.this.containsKey(k);  
    28.     }  
    29.     };  
    30. }  
    31. return keySet;  
    32.    }
     
    结论:
    通过上边的测试我们可以看出,采用entrySet方式遍历效率要优于keySet,因此在开发中要使用entrySet,尽量避免少使用keySet。
  • 相关阅读:
    网络通讯协议的基本要素
    java实现二维码的生成与解析
    SpringCloud应用间通信-RestTemplate与Feign
    SpringCloud服务注册与发现-Eureka、Nacos和Consul
    极光推送-java消息推送app
    Git的回滚和撤销操作
    SOFABoot学习
    记录一次生产环境下EleasticSearch故障(cpu打满)
    记录SQL优化
    利用二进制存储多种状态
  • 原文地址:https://www.cnblogs.com/wzhanke/p/4817800.html
Copyright © 2011-2022 走看看