谨慎使用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。
posted @ 2015-09-17 21:56  wzhanke  阅读(730)  评论(0编辑  收藏  举报