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.   public static void main(String[] args) ...{
  3.   HashMap hashmap = new HashMap();
  4.   for (int i = 0; i < 1000; i ) ...{
  5.       hashmap.put("" i, "that's all");
  6.   }
  7.   long num = Calendar.getInstance().getTimeInMillis();
  8.   Iterator iterator = hashmap.keySet().iterator();
  9.   while (iterator.hasNext()) ...{
  10.       System.out.print(hashmap.get(iterator.next()));
  11.   }
  12.   System.out.println();
  13.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);
  14.   listHashMap();
  15.   }
  16.   public static void listHashMap() ...{
  17.         java.util.HashMap hashmap = new java.util.HashMap();
  18.   
  19. for (int i = 0; i < 1000; i ) ...{
  20.      hashmap.put("" i, "that's all");
  21.   }
  22.   long num = Calendar.getInstance().getTimeInMillis();
  23.   java.util.Iterator it = hashmap.entrySet().iterator();
  24.   while (it.hasNext()) ...{
  25.   java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
  26.   // entry.getKey() 返回与此项对应的键
  27.   // entry.getValue() 返回与此项对应的值
  28.   System.out.print(entry.getValue());
  29.   }
  30.   System.out.println();
  31.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);
  32.   }
  33.   }
 
 

看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. public boolean hasNext() {
  8. return i.hasNext();
  9. }
  10. public K next() {
  11. return i.next().getKey();
  12. }
  13. public void remove() {
  14. i.remove();
  15. }
  16. };
  17. }
  18. public int size() {
  19. return AbstractMap.this.size();
  20. }
  21. public boolean contains(Object k) {
  22. return AbstractMap.this.containsKey(k);
  23. }
  24. };
  25. }
  26. return keySet;
  27. }
 
结论:
通过上边的测试我们可以看出,采用entrySet方式遍历效率要优于keySet,因此在开发中要使用entrySet,尽量避免少使用keySet。

最新文章

  1. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
  2. 另类vs2015+xamarin 的android界面乱码 解决
  3. ios更新UI时请尝试使用performSelectorOnMainThread方法
  4. [设计模式] javascript 之 迭代子模式
  5. 整理string类常见方法的使用说明
  6. 传参方式由url携带改为post提交
  7. Oracle Enterprise Linux 64-bit下安装apache-tomcat-7.0.53步骤
  8. printf &quot;%.*s&quot; 分类: 小细节 2015-07-04 14:36 2人阅读 评论(0) 收藏
  9. Verilog语言实现并行(循环冗余码)CRC校验
  10. Jmter接口网站压力测试工具使用记录
  11. 别人的Linux私房菜(23)软件安装RPM、SRPM、YUM
  12. 手动部署 kubernetes 1.9 记录
  13. vue 项目其他规范
  14. elasticsearch更改mapping,不停服务重建索引(转)
  15. Spark的启动进程详解
  16. docker 下载加速
  17. ANT DESIGN PRO 脚手架.... 懒人福音
  18. CSS过渡动画之transition
  19. djb2:一个产生简单的随机分布的哈希函数
  20. 九 assign和subscribe

热门文章

  1. Python - 面向对象(二)类方法、静态方法
  2. nmon使用问题汇总(不定期更新)
  3. 【面试必备】用了那么多次 ping,是时候知道 ping 是如何工作的了!
  4. 阿里淘宝的S1级别bug,到底是谁的锅?
  5. c# 对SOAP返回XML字符串的解析方法
  6. C语言经典练习题:水仙花数
  7. hdu2087kmp模板练习
  8. Matplotlib 精简实例入门
  9. [最短路,最大流最小割定理] 2019 Multi-University Training Contest 1 Path
  10. Ubuntu18.04下安装MySQL5.7(支持win10-wsl环境)