JAVA - HashMap,TreeMap迭代
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迭代的更多相关文章
- 【java】TreeMap/HashMap的循环迭代中 keySet和entrySet和forEach方式 + map的几种迭代方式
参考链接:https://www.cnblogs.com/crazyacking/p/5573528.html ================================== java紫色代表迭 ...
- JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API
一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的 ...
- JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API
森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397 文章- 0 评论- 78 JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...
- [Java] HashMap、TreeMap、Hashtable排序
Java中对Map(HashMap,TreeMap,Hashtable等)的排序时间 首先简单说一下他们之间的区别: HashMap: 最常用的Map,它根据键的HashCode 值存储数据,根据键可 ...
- Java HashMap,LinkedHashMap,TreeMap
Java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMapMap主要用于存储健值对,根据 ...
- HashMap TreeMap ConcurrentHashMap 源码
1 HashMap java se 1.6 1.1 父类 java.lang.Object 继承者 java.util.AbstractMap<K,V> 继承者 java.util.Has ...
- HashMap TreeMap ConcurrentHashMap
1 HashMap java se 1.6 1.1 父类 java.lang.Object 继承者 java.util.AbstractMap<K,V> 继承者 java.util.Has ...
- [翻译]Java HashMap工作原理
大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.Ha ...
- java HashMap那点事
集合类的整体架构 比较重要的集合类图如下: 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(用二 ...
随机推荐
- VS开发中的代码编写小技巧——避免重复代码编写的几种方法
上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都能保持一个积极向上的心态,去迎接丰富多彩的人生. 在开发过程中, ...
- css选择器优先级全解析
这样一个问题: <!doctype html> <htmllang="en"> <head> <metacharset="UTF ...
- Linux Shell变量
200 ? "200px" : this.width)!important;} --> 介绍 变量是shell脚本中必不可少的组成部分,在脚本中使用变量不需要提前声明.在ba ...
- memcache(三)内存管理
memcached(三)内存管理 memcached使用预申请的方式来管理内存的分配,从而避免内存碎片化的问题.如果采用mallo和free来动态的申请和销毁内存,必然会产生大量的内存碎片. 基本知识 ...
- Java程序员的日常 —— 《编程思想》持有对象
集合框架可以说是Java里面必备的知识点了,日常的使用中也会遇到各种情况需要使用到集合.下面就简单介绍下各种集合的使用场景: List List可以看做是数组,实现的方式有两种: ArrayList ...
- Zabbix监控系统深度实践
Zabbix监控系统深度实践(企业级分布式系统自动化运维必选利器,大规模Zabbix集群实战经验技巧总结,由浅入深全面讲解配置.设计.案例和内部原理) 姚仁捷 著 ISBN 978-7-121-24 ...
- java的五种数据类型解析
不知道大家对java的简单数据类型是否了解,下面针对Java的五种类型简单数据类型表示数字和字符,进行详细的讲解和分析. 一.简单数据类型初始化 在Java语言中,简单数据类型作为类的成员变量声明时自 ...
- C#并行编程-并发集合
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- iOS-----用LLDB调试,让移动开发更简单(二)
image lookup –address 当我们有一个地址,想查找这个地址具体对应的文件位置,可以使用image lookup --address,简写为image lookup -a e.g: 当 ...
- Android笔记——了解SDK,数据库sqlite的使用
一.adb是什么? adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具 ...