java 中 Map 的5种遍历方式
时间:2019-03-18
本文章向大家介绍java 中 Map 的5种遍历方式,主要包括java 中 Map 的5种遍历方式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
主测试方法
@Test
public void test1(){
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int n = 1000_0000;
for (int i = 1; i <= n; i++) {
map.put(i, i);
}
System.out.println("======== 1 entrySet 最常用 ==========");
entrySetTest(map);
System.out.println("======== 2 keySet Or Values 取keys或values 时,效率最高 ==========");
keySetOrValuesTest(map);
//System.out.println("======== keySetForValueTest ==========");
keySetForValueTest(map);
System.out.println("======== 3 iterator Type ==========");
iteratorTypeTest(map);
//System.out.println("========iteratorTest==========");
//iteratorTest(map);
System.out.println("======== 4 forEach java 8 效率最低 ==========");
forEachTest(map);
System.out.println("======== 5 stream ForEach java 8 流式 ==========");
streamForEachTest(map);
}
1000万数据测试结果
======== 1 entrySet 最常用 ==========
map.entrySet() time= 65
======== 2 keySet Or Values 取keys或values 时,效率最高 ==========
map.keySet() time= 71
map.keySet().iterator() time= 63
map.values() time= 74
map.values().iterator() time= 64
map.keySet() -> map.get(key) time= 107
======== 3 iterator Type ==========
map.entrySet().iterator() time= 85
======== 4 forEach java 8 效率最低 ==========
map.forEach time= 103
======== 5 stream ForEach java 8 流式 ==========
map.entrySet().stream().forEach time= 62
1、最常用的方法,map.entrySet() 加增强for
/**
* 1
* entrySet 这是最常用的方式,在键值都需要的时候
* @param map
*/
public void entrySetTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
entry.getKey();
entry.getValue();
// System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
long after = System.currentTimeMillis();
System.out.println("map.entrySet() time=\t" + (after - before));
}
2、通过keySet() 或 values()获取
/**
* 2(1)keySet values
* 如果只需要键或者值,这个比键值对的要快
* @param map
*/
public void keySetOrValuesTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
// 遍历map中的键
for (Integer key : map.keySet()) {
//System.out.println("Key = " + key);
}
long after = System.currentTimeMillis();
System.out.println("map.keySet() time=\t" + (after - before));
before = System.currentTimeMillis();
// 遍历map中的键
Iterator<Integer> iteratorKeySet = map.keySet().iterator();
while (iteratorKeySet.hasNext()) {
iteratorKeySet.next();
//System.out.println("key = " + iteratorKeySet.next());
}
after = System.currentTimeMillis();
System.out.println("map.keySet().iterator() time=\t" + (after - before));
before = System.currentTimeMillis();
// 遍历map中的值
for (Integer value : map.values()) {
//System.out.println("Value = " + value);
}
after = System.currentTimeMillis();
System.out.println("map.values() time=\t" + (after - before));
before = System.currentTimeMillis();
// 遍历map中的值
Iterator<Integer> iteratorValues = map.values().iterator();
while (iteratorValues.hasNext()) {
iteratorValues.next();
//System.out.println("key = " + iterator.next());
}
after = System.currentTimeMillis();
System.out.println("map.values().iterator() time=\t" + (after - before));
}
/**
* 2(2)keySet get
* 根据键找值,效率很低
* @param map
*/
public void keySetForValueTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
//遍历map中的键
for (Integer key : map.keySet()) {
Integer value = map.get(key);
//System.out.println("Key = " + key + ", Value = " + value);
}
long after = System.currentTimeMillis();
System.out.println("map.keySet() -> map.get(key) time=\t" + (after - before));
}
3、通过迭代器 map.entrySet().iterator()
/**
* 3(1)iterator type
* 迭代器 带泛型
* @param map
*/
public void iteratorTypeTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
Integer key = entry.getKey();
Integer value = entry.getValue();
//System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
long after = System.currentTimeMillis();
System.out.println("map.entrySet().iterator() time=\t" + (after - before));
}
4、map.forEach 注意:java8 才支持
/**
* 4 forEach 遍历的是键值,所以是两个参数
* forEach java8 lambda
* @param map
*/
public void forEachTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
//map.forEach( (key,value) -> {System.out.println("Key = " + key+ ", Value = "+ value);} );
map.forEach( (key,value) -> {} );
long after = System.currentTimeMillis();
System.out.println("map.forEach time=\t" + (after - before));
// 一条语句可以省略{}
//map.forEach( (key,value) -> System.out.println("Key = " + key+ ", Value = "+ value) );
}
5、map.entrySet().stream().forEach 注意:java8 才支持
/**
* 5 stream forEach 遍历的是entry 所以是一个参数
* stream forEach java8 lambda
* @param map
*/
public void streamForEachTest(Map<Integer, Integer> map){
long before = System.currentTimeMillis();
//map.entrySet().stream().forEach( (entry) -> {System.out.println("Key = " + entry.getKey()+ ", Value = "+ entry.getValue());} );
//map.entrySet().stream().forEach( System.out::println);
map.entrySet().stream().forEach( (entry) -> {} );
long after = System.currentTimeMillis();
System.out.println("map.entrySet().stream().forEach time=\t" + (after - before));
// 一个参数可以省略() 一条语句可以省略{}
//map.entrySet().stream().forEach(entry -> System.out.println("Key = " + entry.getKey()+ ", Value = "+ entry.getValue()) );
}
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux内核如何输出中文字符的方法示例
- Linux硬盘合并的实现代码
- 虚拟机Linux桥接模式下设置静态IP详解
- Linux平台安装redis及redis扩展的方法
- Linux环境下快速搭建ftp服务器方法介绍
- Linux通过匿名管道进行进程间通信
- shell判断一个变量是否为空方法总结
- 基于ubuntu16 Python3 tensorflow(TensorFlow环境搭建)
- Linux中的iostat命令使用教程
- 深入解读Linux进程函数fork(),vfork(),execX()
- Linux centos下设置定时备份任务的方法步骤
- Linux 中如何切换相同程序的不同版本
- Linux中查看指定文件夹内各个子文件夹内的文件数量
- Linux系统中 /etc/fstab 文件的深入解读
- bash命令使用详解