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. Java虚拟机7:内存分配原则

    前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数 ...

  2. 【WEB】初探Spring MVC框架

    Spring MVC框架算是当下比较流行的Java开源框架.但实话实说,做了几年WEB项目,完全没有SpringMVC实战经验,乃至在某些交流场合下被同行严重鄙视“奥特曼”了.“心塞”的同时,只好默默 ...

  3. Asp.net下使用HttpModule模拟Filter,实现权限控制

    在asp.net中,我们为了防止用户直接从Url中访问指定的页面而绕过登录验证,需要给每个页面加上验证,或者是在模板页中加上验证.如果说项目比较大的话,添加验证是一件令人抓狂的事情,本次,我就跟大家分 ...

  4. Android多线程分析之四:MessageQueue的实现

    Android多线程分析之四:MessageQueue的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前面两篇文章<Androi ...

  5. Hello Mybatis 02 mybatis generator

    接着上一篇文章通过Mybatis完成了一个User的CRUD的功能之后,这篇开始还需要建立一个Blog类,这样就可以模拟一个简单的微博平台的数据库了. 数据库准备 首先我们,还是需要在数据库中新建一个 ...

  6. swift 加载 storyboard 里的UIViewController

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

  7. 如何在win7系统中安装redis

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/92.html?1455871954 如何在win7系统中安装redis​ ...

  8. Lua 协程coroutine

    协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以 ...

  9. Android笔记——探究活动

    1.活动是什么       活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互.一个应用程序中可以包含零个或多个活动,但不包含任何活动的应用程序 ...

  10. django创建项目

    django创建项目 安装django pip install django==1.9 Note: C:\Python34\Scripts\pip.exe 创建项目 django-admin star ...