注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

谨慎使用keySet:对于HashMap的2种遍历方式比较  

2012-11-20 18:00:48|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

      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。
  评论这张
 
阅读(389)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016