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 是(用二 ...
随机推荐
- 可在广域网部署运行的QQ高仿版 -- GG2014 完美版!新增支持:聊天记录、好友分组、托盘闪动消息提醒、登录状态、GIF动态表情
距上次GG V3.7版本(可在广域网部署运行的QQ高仿版 -- GG叽叽V3.7,优化视频聊天.控制更多相关细节)的发布,已经有50天了,这50天对于GG来说,是一个重大的飞跃.因为这段时间通过一些基 ...
- Chrome开发者工具不完全指南(六、插件篇)
本篇是Chrome开发者工具的结尾篇,最后为大家介绍几款功能强大的插件.在chrome商店里面有很多插件,没事建议大家去逛逛.不过需要FQ,所以诸位请自备神器.一.皮肤插件 首先是大家期盼已久,翘首以 ...
- (翻译)正确实施DevOps-The Lay of the Land
原文地址:http://www.drdobbs.com/architecture-and-design/getting-devops-right-the-lay-of-the-land/2400626 ...
- IOS 公共类-MyMBProgressUtil Progress显示
IOS 公共类-MyMBProgressUtil Progress显示 此公共类用于显示提示框,对MBProgress的进一步封装.可以看下面的代码 接口: @interface MyMBProgre ...
- js常用函数
日期时间函数(需要用变量调用): var c=new Date; c.getDate(); document.write(c) //获取当前时间 var c=new Date(); c.getTime ...
- Chrome清除dns缓存
Chrome清除dns缓存 为了加快访问速度,Google Chrome浏览器采用了预提DNS记录,在本地建立DNS缓存的方法,加快网站的连接速度.你在谷歌Chrome浏览器的地址栏中输入about: ...
- Linux常用命令01
Linux对于我们来说,就是跑程序的运行平台,简单的来说,就是服务器,自己也没怎么系统的学习Linux的命令,随着项目的需要, 比如要查找日志,哪里出问题了,哪里报错了,因此自己也慢慢地懂一些常用的L ...
- KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
KO是如何实现自动更新的 初学者可以掠过该篇,如果你是一个刨根问底的开发者,那本节将告诉你KO是如何实现依赖追踪和UI自动更新的. 其实很简单,KO的依赖追踪算法如下: 当你声明一个计算监控属性,KO ...
- javaweb回顾第十一篇过滤器(附实现中文乱码问题)
1:过滤器概念 过滤器就是一种在请求目标资源的中间组件,比喻把污水转换成纯净水中间需要一个污水净化设备,那么这个设备就好比一个过滤器.那么我用图来表示过滤器(可以有多个过滤器)运行的过程 2:Filt ...
- switch判断注意点
if判断,如果判断的两个值类型不同,会继续隐性转换,==,当然如果使用===就不会. 1 if(2=="2"){ 2 console.log("true"); ...