HashMap的遍历有两种方式,一种是entrySet的方式,另外一种是keySet的方式。

第一种利用entrySet的方式:

Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();Object key = entry.getKey();Object val = entry.getValue();
}

上面的方式可以变化为for循环的形式:

Map<String, String> map = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet()) {entry.getKey();entry.getValue();
}

第二种利用keySet的方式:

Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {Object key = iter.next();Object val = map.get(key);
}

上面的方式也可以变化为for循环的形式:

Map<String, String> map = new HashMap<String, String>();
for (String key : map.keySet()) {map.get(key);
}

这两种方式那种效率高呢?可以从下面的试验可以看出来:

public class Test
{public static void main(String[] args){HashMap<String, String> map = new HashMap<String, String>();for (int i = 0; i < 1000000; i++){map.put(i + "", "hello world");}long begin1 = System.currentTimeMillis();Iterator iterator1 = map.entrySet().iterator();while (iterator1.hasNext()){Map.Entry entry = (Map.Entry) iterator1.next();Object key1 = entry.getKey();Object val1 = entry.getValue();}long end1 = System.currentTimeMillis();System.out.println("map.entrySet方式变量花费的时间为:" + (end1 - begin1));long begin2 = System.currentTimeMillis();Iterator iterator2 = map.keySet().iterator();while (iterator2.hasNext()){Object key2 = iterator2.next();Object val2 = map.get(key2);}long end2 = System.currentTimeMillis();System.out.println("map.keySet方式变量花费的时间为:" + (end2 - begin2));}
}

结论:
经过运行多次,我发现两者的运行时间相差不多,而且没有明确显示出那种变量方式更快一些。有的人可能会觉得第一种变量方式会快一些,因为他们觉 得:keySet方式其实是遍历了2次,一次是转为iterator,一次就从HashMap中取出key所对应的value,而entry方式只遍历了 一次,把key和value都放到了entry中,所以entry方式更快一些。
但是我觉得这种分析的方式比较主观,我们更应该从源码的角度去分析。首先看一下迭代器的源码:

keySet的迭代器:

private final class KeyIterator extends HashIterator<K> {public K next() {return nextEntry().getKey();}
}

entrySet的迭代器:

private final class EntryIterator extends HashIterator<Map.Entry<K,V>> {public Map.Entry<K,V> next() {return nextEntry();}
}

从上面我们可以看到只是返回值不同而已,父类相同,所以性能相差不多。下面我们再看一下get方法的源码:

public V get(Object key) {
if (key == null)
return getForNullKey();
Entry<K,V> entry = getEntry(key);
return null == entry ? null : entry.getValue();
}

final Entry<K,V> getEntry(Object key) {
int hash = (key == null) ? 0 : hash(key);
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
return null;
}

从上面的源码发现get的时间复杂度取决于for循环循环次数,即hash算法。所以两种性能差别不大。从上面的分析来看,我们得到最终的结论:
(1)HashMap的循环,如果既需要key也需要value,直接用下面的即可,foreach简洁易懂。

Map<String, String> map = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet()) {entry.getKey();entry.getValue();
}

(2)如果只是遍历key而无需value的话,可以直接用下面的方式:

Map<String, String> map = new HashMap<String, String>();
for (String key : map.keySet()) {// key process
}

原文地址:http://swiftlet.net/archives/1259

转载于:https://www.cnblogs.com/longshiyVip/p/4633190.html

HashMap两种遍历数据的方式相关推荐

  1. hashmap两种遍历总结!

    1.hashmap两种遍历效率1:2----entry----单个遍历两次 public class HashMapTest { public static void main(String[] ar ...

  2. java中两种遍历集合的方式_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

  3. 三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.图的遍历.遍历过程中得到的顶点序列称为图遍历序列. 2 深度优先搜索 2.1 算法思想 ...

  4. 有向图的广度优先遍历_图的两种遍历方式

    1 引言 遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则,依次访 ...

  5. lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.   在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则 ...

  6. 哪两种遍历方式可以唯一确定一棵二叉树,结合力扣105题

    对于一棵树的前中序三种顺序的遍历方式,任何一种单独拿出来都无法确定一棵树,那么两种遍历方式得到的节点数据能否构建一棵二叉树呢? 先来看看能有哪几种组合: 先序遍历 + 中序遍历 后序遍历 + 中序遍历 ...

  7. java map遍历_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

  8. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法:三十张图弄懂「图的两种遍历方式」...

    原创: 进击的HelloWorld1 引言遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点 ...

  9. c++层次遍历_数据结构与算法,弄懂图的两种遍历方式

    1 引言   遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次.  在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点出发,按照一定的访问规则, ...

最新文章

  1. c primer plus(第五版)读书笔计 第四章(1)
  2. 页面 table 可编辑的实现
  3. 21-matlab 迷宫题
  4. 3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你~
  5. python天气预报的功能介绍_python实现智能语音天气预报
  6. 程序员真的是吃青春饭的吗?(献给即将进入职场的程序员们)
  7. 为什么阿里巴巴的市值比京东高,世界500排名比京东靠后?
  8. Mysql添加远程访问权限
  9. oracle审计功能启动关闭
  10. BOSS直聘自动投简历
  11. “知识资源细颗粒度建设和标签标引”规则规范心得说明
  12. java怎么分解质因数,java分解质因数的方法
  13. 华为手机USB连不上电脑的解决方法
  14. IT行业为何如此吃香?2019学习IT就业前景分析
  15. html简单下拉菜单
  16. 设计网站中的精品,你可能需要它--第五期(Logo设计,助你提升效率)
  17. 苹果恢复出厂设置系统也会还原吗_手机恢复出厂设置会影响使用吗?听听专业人士看法,减少后顾之忧...
  18. C++实现Socket连接通信
  19. mysql 优化总结
  20. 【转载】关于MSHTML

热门文章

  1. php通过ajax下载文件,通过ajax调用php下载文件
  2. 轨道运营管理专业自荐书_轨道运营管理专业自荐信x
  3. C语言应用笔记:C语言typedef关键字及其使用
  4. 武汉城市职业学院计算机分数线,武汉城市职业学院历年分数线 2021武汉城市职业学院录取分数线...
  5. mysql error 1114,mysql error 1114 table is full 处理分享
  6. python get()函数_C++使用ffpython嵌入和扩展python(python2和python3)
  7. mysql增加sort_buffer_设置sort_buffer_size
  8. [渝粤教育] 中国传媒大学 政治传播学 参考 资料
  9. 【渝粤教育】国家开放大学2018年秋季 1398T分析化学(本) 参考试题
  10. 【渝粤题库】陕西师范大学200831 编译原理 作业