1.使用for_each循环迭代

public class TestUnit {
public static void main(String[] args) {
HashMap hashMap=new HashMap<Integer,String>(); hashMap.put(1,"aaa");
hashMap.put(2,"bbb");
hashMap.put(3,"ccc"); for(Object m:hashMap.entrySet()) {
Map.Entry mapEntry=(Map.Entry)m;
Object key=mapEntry.getKey();
Object value=mapEntry.getValue();
System.out.println("key="+key+",value="+value);
}
}
}

2.通过构造HashMap的entrySet来迭代

Iterator iter=hashMap.entrySet().iterator();
while(iter.hasNext()){
Map.Entry mapEntry=(Map.Entry) iter.next();
Object key=mapEntry.getKey();
Object value=mapEntry.getValue();
System.out.println("key="+key+",value="+value);
}

3.先取得HashMap的keySet,再用get(key)访问

Set set=hashMap.keySet();
Iterator iter=set.iterator();
while(iter.hasNext()){
Object key=iter.next();
Object value=hashMap.get(key);
System.out.println("key="+key+",value="+value);
}

Test

据说是用entrySet更快一点,写段代码测试了一下,确实如此。(纠正:后来发现测试存在问题,谁先执行谁的耗时要多一点,估计是和第一个需要开辟输出缓冲区有关

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; public class TestUnit { public static void main(String[] args) {
HashMap<Integer, String> hashMap = new HashMap();
for (int i = 0; i < 10000; i++) {
hashMap.put(i, "Hello World!");
}
forEachTest(hashMap);
entrySetTest(hashMap);
keySetTest(hashMap);
} static long forEachTest(Map map){
long startTime = System.currentTimeMillis(); for(Object m:map.entrySet()) {
Map.Entry mapEntry=(Map.Entry)m;
System.out.print(mapEntry.getValue());
} long endTime = System.currentTimeMillis();
System.out.println("\nforEachTest : " + (endTime - startTime));
return endTime - startTime;
} static long keySetTest(Map map) {
long startTime = System.currentTimeMillis(); Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
System.out.print(map.get(iter.next()));
} long endTime = System.currentTimeMillis();
System.out.println("\nkeySetTest : " + (endTime - startTime));
return endTime - startTime;
} static long entrySetTest(Map map) {
long startTime = System.currentTimeMillis(); Iterator iter = map.entrySet().iterator();
Map.Entry mapEntry;
while (iter.hasNext()) {
mapEntry = (Map.Entry) iter.next();
System.out.print(mapEntry.getValue());
} long endTime = System.currentTimeMillis();
System.out.println("\nentrySetTest : " + (endTime - startTime));
return endTime - startTime;
}
}

原因分析:

  • 使用keySet方法访问时,构建的Set只由key组成,访问每一个value时要重新计算Hash值然后根据Hash值到Map中查找value;
  • 使用entrySet方法访问时,构建的Set直接由<key,value>组成,访问每一个value时直接取就行,无需计算Hash值。

JAVA - HashMap,TreeMap迭代的更多相关文章

  1. 【java】TreeMap/HashMap的循环迭代中 keySet和entrySet和forEach方式 + map的几种迭代方式

    参考链接:https://www.cnblogs.com/crazyacking/p/5573528.html ================================== java紫色代表迭 ...

  2. JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API

    一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的 ...

  3. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  4. [Java] HashMap、TreeMap、Hashtable排序

    Java中对Map(HashMap,TreeMap,Hashtable等)的排序时间 首先简单说一下他们之间的区别: HashMap: 最常用的Map,它根据键的HashCode 值存储数据,根据键可 ...

  5. Java HashMap,LinkedHashMap,TreeMap

    Java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMapMap主要用于存储健值对,根据 ...

  6. HashMap TreeMap ConcurrentHashMap 源码

    1 HashMap java se 1.6 1.1 父类 java.lang.Object 继承者 java.util.AbstractMap<K,V> 继承者 java.util.Has ...

  7. HashMap TreeMap ConcurrentHashMap

    1 HashMap java se 1.6 1.1 父类 java.lang.Object 继承者 java.util.AbstractMap<K,V> 继承者 java.util.Has ...

  8. [翻译]Java HashMap工作原理

    大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...

  9. java HashMap那点事

    集合类的整体架构 比较重要的集合类图如下:   有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(用二 ...

随机推荐

  1. RCP:美化基于eclipse3.7.2的RCP界面

    从e4开始,eclipse rcp界面具备了深度自定义的能力. 但是在eclipse3.7.2上,几乎没有提供能够用于修改界面的外部接口. 这里介绍一种方式来自定义你自己的eclipse rcp. 先 ...

  2. css实现左栏固定右栏自适应,高度自适应的布局

    收集css中的基础知识,所以这并不是什么新鲜的技术,只是作为备忘~本文的内容如题所示,是一个简单的布局,用于左右两栏布局的页面,左侧是固定宽度,右侧占据剩余的宽度.在垂直方向,始终以高度最大的一栏为基 ...

  3. 从Windows中卸载Apache

    在重装Apache或者妳不再需要它的时候,这时就需要将它卸载. 下面是步骤: 打开开始菜单(win8中ÿ+X)或者我的电脑(废话) 找到并打开Apache的安装目录(Program Files\Apa ...

  4. ASP.NET Web API 应用教程(一) ——数据流使用

    相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要有三篇内容. 主要内容如下: I  数据 ...

  5. xamarin UWP平台下 HUD 自定义弹窗

    在我的上一篇博客中我写了一个在xamarin的UWP平台下的自定义弹窗控件.在上篇文章中介绍了一种弹窗的写法,但在实际应用中发现了该方法的不足: 1.当弹窗出现后,我们拖动整个窗口大小的时候,弹窗的窗 ...

  6. swift 加载 storyboard 里的UIViewController

    let storyBoard:UIStoryboard! = UIStoryboard(name: "Main", bundle: nil) let deskVC:DeskView ...

  7. JS判断鼠标移入元素的方向

    最终效果 这里的关键主要是判断鼠标是从哪个方向进入和离开的 $("li").on("mouseenter mouseleave",function(e) { v ...

  8. EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离

    回到目录 前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了

  9. Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结

    Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结 软件项目中的非法模块非法功能非法分子与人类中的非法分子很是相似,必须要建议不同的的约束管理标准化... 软 ...

  10. 更新日志 - fir.im 新版优化上线

    经过这段时间的用户反馈收集和新版本的功能调研,我们对 fir.im Rio 上传下载.应用管理再次做了调整优化.感谢之前内测用户的反馈与建议.目前 fir.im Rio 新版已正式上线,主要优化有以下 ...