一、map遍历的效率

先创建一个map,添加好数据:

Map<String, String> map = new HashMap<>();
for (int i = 0; i < 1000000; i++) {
map.put(i + "", i + "AA");
}

1、keySet的for循环方式:

//只获取key
public static void keySetForGetKey(Map<String, String> map){
long startTime = System.currentTimeMillis();
for (String key : map.keySet()) {
}
long endTime = System.currentTimeMillis();
System.out.println("keySetForGetKey运行时间" + (endTime - startTime));
}
//获取key和value
public static void keySetForGetKeyAndValue(Map<String, String> map){
long startTime = System.currentTimeMillis();
for (String key : map.keySet()) {
String value = map.get(key);
}
long endTime = System.currentTimeMillis();
System.out.println("keySetForGetKeyAndValue运行时间" + (endTime - startTime));
}

2、keySet的iterator迭代器方式:

//只获取key
public static void keySetIteratorGetKey(Map<String, String> map){
long startTime = System.currentTimeMillis();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
}
long endTime = System.currentTimeMillis();
System.out.println("keySetIteratorGetKey运行时间" + (endTime - startTime));
}
//获取key和value
public static void keySetIteratorGetKeyAndValue(Map<String, String> map){
long startTime = System.currentTimeMillis();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = map.get(iterator.next());
}
long endTime = System.currentTimeMillis();
System.out.println("keySetIteratorGetKeyAndValue运行时间" + (endTime - startTime));
}

3、entrySet的for循环方式:

//只获取key
public static void entrySetForGetKey(Map<String, String> map){
long startTime = System.currentTimeMillis();
for (Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
}
long endTime = System.currentTimeMillis();
System.out.println("entrySetForGetKey运行时间" + (endTime - startTime));
}
//获取key和value
public static void entrySetForGetKeyAndValue(Map<String, String> map){
long startTime = System.currentTimeMillis();
for (Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
}
long endTime = System.currentTimeMillis();
System.out.println("entrySetForGetKeyAndValue运行时间" + (endTime - startTime));
}

4、entrySet的iterator迭代器方式:

//只获取key
public static void entrySetIteratorGetKey(Map<String, String> map){
long startTime = System.currentTimeMillis();
Iterator<Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().getKey();
}
long endTime = System.currentTimeMillis();
System.out.println("entrySetIteratorGetKey运行时间" + (endTime - startTime));
}
//获取key和value
public static void entrySetIteratorGetKeyAndValue(Map<String, String> map){
long startTime = System.currentTimeMillis();
Iterator<Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().getKey();
String value = iterator.next().getValue();
}
long endTime = System.currentTimeMillis();
System.out.println("entrySetIteratorGetKeyAndValue运行时间" + (endTime - startTime));
}

最终的运行结果为:

keySetForGetKey运行时间28
keySetForGetKeyAndValue运行时间43
keySetIteratorGetKey运行时间25
keySetIteratorGetKeyAndValue运行时间36
entrySetForGetKey运行时间27
entrySetForGetKeyAndValue运行时间28
entrySetIteratorGetKey运行时间25
entrySetIteratorGetKeyAndValue运行时间29

总结:

entrySet的方式整体都是比keySet方式要高一些( ★★★ 数据上表明:map.entrySet().iterator() 是最快的 );

单纯的获取key来说,两者的差别并不大,但是如果要获取value,还是entrySet的效率会更好,因为keySet需要从map中再次根据key获取value,而entrySet一次都全部获取出来;
iterator的迭代器方式比foreach的效率高。
二、foreach和iterator

其实foreach的语法只是对iterator进行了简单的包装,使用起来更加方便而已,但是如果在foreach循环体内,对集合元素进行删除添加操作的时候,会报出ConcurrentModificationException,并发修改异常。如果需要在遍历集合的时候对象集合中元素进行删除操作,需要使用iterator的遍历方式,iterator自带的remove删除方式不会报出异常。
---------------------
原文:https://blog.csdn.net/zajiayouzai/article/details/80922610

map遍历的几种方式和效率问题的更多相关文章

  1. map遍历的四种方式

    原文 http://blog.csdn.net/dayanxuqun/article/details/26348277 以下是map遍历的四种方式: // 一.推荐只用value的时候用,都懂的... ...

  2. Map遍历的几种方式

    代码示例 /** * @author liaowenhui * @date 2020/6/25 11:15 */ public class TestMap { public static void m ...

  3. java中Map遍历的四种方式

    在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方式去遍历. 方法一:在for循环 ...

  4. Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 :这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> m ...

  5. 【转】Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> ma ...

  6. Map集合遍历的四种方式理解和简单使用-----不能for循环遍历

    Map集合遍历的四种方式理解和简单使用   ~Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1:无非就是通过map.keySet()获取到值,然后 ...

  7. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  8. [Java] HashMap遍历的两种方式

    Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...

  9. Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)

    示例代码如下: package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date ...

随机推荐

  1. owin启动事项

    在上下文中找不到 owin.Environment 项 owin没有启动. 尝试加载应用时出现了以下错误.- 找不到包含 OwinStartupAttribute 的程序集 startup类不是通过v ...

  2. lubuntu16.04 安装过程以及ssd测试模型的环境配置

    1.系统启动盘(ultraISO)制作启动盘, 1/5 文件->打开,打开我们的iso镜像 2/5 选择我们的u盘, 3/5 点击启动->写入硬盘映像 4/5 写入方式选择raw,格式化然 ...

  3. mac mysql 操作

    参考 http://www.cnblogs.com/chenmo-xpw/p/6102933.html http://www.cnblogs.com/uoar/p/6492521.html 1.启动M ...

  4. 【收集资料】OpenGL学习

    1.课本配套网站,有Sample Code和书中的图片等   http://math.ucsd.edu/~sbuss/MathCG/ 2.Visual C++的帮助系统可查阅基本OpenGL函数(不包 ...

  5. python使用变量

    #不建议用加号,建议用.format name = input('name:') age = input('age:') print( name ,age) print('姓名:',name,'年龄: ...

  6. 图的邻接矩阵存储实现,C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  7. 异常处理机制中的return关键字

    Java中,执行try-catch-finally语句需要注意: 第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂 ...

  8. 牛客第二场 J farm

    White Rabbit has a rectangular farmland of n*m. In each of the grid there is a kind of plant. The pl ...

  9. sqlite的数据类型

    参考sqlite官方文档:https://www.sqlite.org/datatype3.html 绝大多数的SQL数据库采用静态的.严格的数据类型,数据库中的值由数据表的列类型定义决定. 然而,s ...

  10. Java学习笔记11(this,super)

    this在构造方法间的使用, public class Person { private String name; private int age; public Person() { //this( ...