ArrayList和HashMap遍历比较

目录

  • 一、ArrayList遍历方式
    • 1、普通for循环遍历
    • 2、增强for循环遍历
    • 3、Iterator迭代器遍历
    • 4、三种方式比较
  • 二、Map遍历方式
    • 1、增强for循环 + keySet() 遍历
    • 2、增强for循环 + entrySet() 遍历
    • 3、Iterator + keySet() 遍历
    • 4、Itorator + entrySet() 遍历
    • 5、四种方式比较
  • 三、java开发手册(关于map的)

一、ArrayList遍历方式

1、普通for循环遍历

for(int i=0; i<lists.size(); i++){String key = lists.get(i);
}

2、增强for循环遍历

for(String str : lists){String key = str;
}

3、Iterator迭代器遍历

Iterator iterator = lists.iterator();
while (iterator.hasNext()){String key = iterator.next().toString();
}

4、三种方式比较

import java.util.ArrayList;
import java.util.Iterator;public class ArrayListFor {private static ArrayList<String> initData(){ArrayList<String> lists = new ArrayList<String>(1000000);for(int i=0; i<1000000; i++){lists.add(i + "abcdefg");}return lists;}private static String forOne(ArrayList<String> lists){StringBuilder sb = new StringBuilder();sb.append("普通For循环(int i=0; i<count; i++)。");sb.append("\r\n");long start = System.currentTimeMillis();for(int i=0; i<lists.size(); i++){String key = lists.get(i);}long end = System.currentTimeMillis();sb.append("duration = [" + (end - start) + "]ms");sb.append("\r\n");return sb.toString();}private static String forTwo(ArrayList<String> lists){StringBuilder sb = new StringBuilder();sb.append("加强For循环(int i : lists)。");sb.append("\r\n");long start = System.currentTimeMillis();for(String str : lists){String key = str;}long end = System.currentTimeMillis();sb.append("duration = [" + (end - start) + "]ms");sb.append("\r\n");return sb.toString();}private static String forThree(ArrayList<String> lists){StringBuilder sb = new StringBuilder();sb.append("Iterator循环(list.iterator())。");sb.append("\r\n");long start = System.currentTimeMillis();Iterator iterator = lists.iterator();while (iterator.hasNext()){String key = iterator.next().toString();}long end = System.currentTimeMillis();sb.append("duration = [" + (end - start) + "]ms");sb.append("\r\n");return sb.toString();}public static String forCycle(ArrayList<String> lists) {StringBuilder sb = new StringBuilder();sb.append("ArrayList遍历比较:");sb.append("\r\n");sb.append(forOne(lists));sb.append(forTwo(lists));sb.append(forThree(lists));return sb.toString();}public static void main(String[] args) {ArrayList<String> lists = initData();for(int i=0; i<5; i++){System.out.println(forCycle(lists));}}
}

运行结果:

ArrayList遍历比较:
普通For循环(int i=0; i<count; i++)。
duration = [33]ms
加强For循环(int i : lists)。
duration = [35]ms
Iterator循环(list.iterator())。
duration = [34]msArrayList遍历比较:
普通For循环(int i=0; i<count; i++)。
duration = [29]ms
加强For循环(int i : lists)。
duration = [32]ms
Iterator循环(list.iterator())。
duration = [32]msArrayList遍历比较:
普通For循环(int i=0; i<count; i++)。
duration = [26]ms
加强For循环(int i : lists)。
duration = [27]ms
Iterator循环(list.iterator())。
duration = [27]msArrayList遍历比较:
普通For循环(int i=0; i<count; i++)。
duration = [26]ms
加强For循环(int i : lists)。
duration = [34]ms
Iterator循环(list.iterator())。
duration = [27]msArrayList遍历比较:
普通For循环(int i=0; i<count; i++)。
duration = [26]ms
加强For循环(int i : lists)。
duration = [27]ms
Iterator循环(list.iterator())。
duration = [28]ms

总结: 普通for循环耗时最少,iterator次之,增强for循环耗时最长。

二、Map遍历方式

大致分为 增强for循环Iterator迭代器 两种,而其中每个又各自分为使用 keySet()entrySet() 两种,所以 一共四种

1、增强for循环 + keySet() 遍历

for(String key : maps.keySet()){String str = maps.get(key);
}

2、增强for循环 + entrySet() 遍历

for(Map.Entry<String, String> entry : maps.entrySet()){String str = entry.getValue();
}

3、Iterator + keySet() 遍历

Iterator iterator = maps.keySet().iterator();
while (iterator.hasNext()){String key = iterator.next().toString();String str = maps.get(key);
}

4、Itorator + entrySet() 遍历

Iterator iterator = maps.entrySet().iterator();
while (iterator.hasNext()){Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();String str = entry.getValue();
}

5、四种方式比较

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class HashMapFor {private static HashMap<String,String> initData(){HashMap<String,String> maps = new HashMap<String, String>(10000000 * 2);for(int i=0; i<10000000; i++){String key = i + "abcdefg";maps.put(key, key);}return maps;}private static String forOne(HashMap<String, String> maps){StringBuilder sb = new StringBuilder();sb.append("增强For循环 + keySet()(int i : map.keySet())。");sb.append("\r\n");long start = System.currentTimeMillis();for(String key : maps.keySet()){String str = maps.get(key);}long end = System.currentTimeMillis();sb.append("duration = [" + (end - start) + "]ms");sb.append("\r\n");return sb.toString();}private static String forTwo(HashMap<String, String> maps){StringBuilder sb = new StringBuilder();sb.append("增强For循环 + entrySet()(Entry<> entry : map.entrySet())。");sb.append("\r\n");long start = System.currentTimeMillis();for(Map.Entry<String, String> entry : maps.entrySet()){String str = entry.getValue();}long end = System.currentTimeMillis();sb.append("duration = [" + (end - start) + "]ms");sb.append("\r\n");return sb.toString();}private static String forThree(HashMap<String, String> maps){StringBuilder sb = new StringBuilder();sb.append("Iterator循环 + keySet()(map.keySet().iterator())。");sb.append("\r\n");long start = System.currentTimeMillis();Iterator iterator = maps.keySet().iterator();while (iterator.hasNext()){String key = iterator.next().toString();String str = maps.get(key);}long end = System.currentTimeMillis();sb.append("duration = [" + (end - start) + "]ms");sb.append("\r\n");return sb.toString();}private static String forFour(HashMap<String, String> maps){StringBuilder sb = new StringBuilder();sb.append("Iterator循环 + entrySet()(map.entrySet().iterator())。");sb.append("\r\n");long start = System.currentTimeMillis();Iterator iterator = maps.entrySet().iterator();while (iterator.hasNext()){Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();String str = entry.getValue();}long end = System.currentTimeMillis();sb.append("duration = [" + (end - start) + "]ms");sb.append("\r\n");return sb.toString();}public static String forCycle(HashMap<String, String> maps) {StringBuilder sb = new StringBuilder();sb.append("HashMap遍历比较:");sb.append("\r\n");sb.append(forOne(maps));sb.append(forTwo(maps));sb.append(forThree(maps));sb.append(forFour(maps));return sb.toString();}public static void main(String[] args) {HashMap<String, String> maps = initData();for(int i=0; i<5; i++){System.out.println(forCycle(maps));}}
}

运行结果:

HashMap遍历比较:
增强For循环 + keySet()int i : map.keySet())。
duration = [66]ms
增强For循环 + entrySet()Entry<> entry : map.entrySet())。
duration = [46]ms
Iterator循环 + keySet()(map.keySet().iterator())。
duration = [68]ms
Iterator循环 + entrySet()(map.entrySet().iterator())。
duration = [45]msHashMap遍历比较:
增强For循环 + keySet()int i : map.keySet())。
duration = [63]ms
增强For循环 + entrySet()Entry<> entry : map.entrySet())。
duration = [44]ms
Iterator循环 + keySet()(map.keySet().iterator())。
duration = [65]ms
Iterator循环 + entrySet()(map.entrySet().iterator())。
duration = [47]msHashMap遍历比较:
增强For循环 + keySet()int i : map.keySet())。
duration = [48]ms
增强For循环 + entrySet()Entry<> entry : map.entrySet())。
duration = [37]ms
Iterator循环 + keySet()(map.keySet().iterator())。
duration = [72]ms
Iterator循环 + entrySet()(map.entrySet().iterator())。
duration = [34]msHashMap遍历比较:
增强For循环 + keySet()int i : map.keySet())。
duration = [54]ms
增强For循环 + entrySet()Entry<> entry : map.entrySet())。
duration = [41]ms
Iterator循环 + keySet()(map.keySet().iterator())。
duration = [49]ms
Iterator循环 + entrySet()(map.entrySet().iterator())。
duration = [34]msHashMap遍历比较:
增强For循环 + keySet()int i : map.keySet())。
duration = [47]ms
增强For循环 + entrySet()Entry<> entry : map.entrySet())。
duration = [31]ms
Iterator循环 + keySet()(map.keySet().iterator())。
duration = [47]ms
Iterator循环 + entrySet()(map.entrySet().iterator())。
duration = [31]ms

总结:

  • entrySet()keySet() 效率要好点
  • Iterator 要比 for each 效率要好点
  • 所以:Iterator + entrySet() 效率最好(参考需谨慎)

三、java开发手册(关于map的)

  • 推荐使用 entrySet 遍历 Map 集合 KV,而不是使用 keySet 方式遍历

  • 原因:keySet 其实是遍历了2次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet 只是遍历了一次就把 keyvalue 都放到了 entry 中,效率更高。如果是JDK8,使用 Map.foreach 方法。

  • 正例:values() 返回的是V值集合,是一个 list 集合对象,keySet() 返回的是 K值集合,是一个Set集合对象,entrySet() 返回的是 K-V值组合集合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++primer 12章 动态内存和智能指针

C引入智能指针的目的 使用智能指针来管理动态分配的对象&#xff0c;当一个对象应该被释放的时候&#xff0c;指向他的智能指针确保自动释放它 内存分配 静态内存&#xff1a;局部static对象、类static数据成员、定义在任何函数之外的变量栈内存&#xff1a;定义在函数内的非…

Mac下iTerm2的安装与配置

目录一、iTerm2简介二、下载以及安装三、iTerm2主题配置四、配置Oh My Zsh1、安装方式&#xff08;1&#xff09;一键安装&#xff08;2&#xff09;手动安装3、切换zsh4、修改主题五、配置Meslo字体六、声明高亮七、自动建议填充八、iTerm2快速隐藏和显示九、iTerm2隐藏用户名…

codeforces 282A-C语言解题报告

282A题目网址 题目解析 1.第一行输入n(表示有n条语句都要执行),再输入X,X(都表示X1),–X,X–(都表示X-1),最初X0,输出X的值 2.使用字符数组去存放每一行的字符串,因为字符串,所以直接整体存入scanf("%s",c); 3.因为字符数组最后一个是’\0’去表示末尾,所以要开辟…

Java命令:jinfo — 查看进程参数

目录一、简介二、常用命令1、jinfo -flags pid : 打印当前指定java进程中已经设定的所有JVM参数信息2、jinfo -flag pid : 打印指定名称的参数3、jinfo -flag [|-] pid : 打开或关闭参数4、jinfo -sysprops pid : 打印当前java进程中设定的系统环境参数一、简介 jinfo 是 JDK …

C++primer第八章 IO库 8.1 IO类

IO库设施 istream &#xff08;输入流&#xff09;类型&#xff0c;提供输入操作。ostream &#xff08;输出流&#xff09;类型&#xff0c;提供输出操作。cin,—个 istream对象&#xff0c;从标准输入读取数据。cout, 一个ostream对象&#xff0c;向标准输出写入数据。cerr…

2014年英语一作文partB漫画作文

题目 Write an essay of 160-200 words based on the following drawing.In your essay you should describe the drawing brieflyexplain its intended meaning,give your comments 做题点 1.使用三段式,第一段:图片内容;第二段:图片暗示;第三段:写自己的评论 2.描述图片…

Spring Cloud 系列之 Nacos 配置中心

目录一、Nacos简介二、Nacos安装及配置1、环境准备2、安装包下载&#xff08;1&#xff09;源码方式&#xff08;2&#xff09;发行包方式3、启动Nacos服务4、Nacos数据库配置&#xff08;1&#xff09;MySQL数据源&#xff08;2&#xff09;初始化 MySQL 数据库&#xff08;3&…

C++primer第八章 IO库 8.2 文件输入输出

8.2文件输入输出 头文件fstream定义了三个类型来支持文件IO&#xff1a;ifstream从一个给定文件读取数据&#xff0c;ofstream向一个给定文件写入数据&#xff0c;以及fstream可以读写给定文件。在17.5.3节中&#xff08;第676页&#xff09;我们将介绍如何对同一个文件流既读…

codeforces 112A-C语言解题报告

112A题目网址 题目解析 1.输入两行字符串,不区分大小写地使用字典序去比较大小 A<B -1 A>B 1 AB 0 举例: 输入 abcdefg AbCdEfF 输出 1 2.字典序:在遇到第一个不同的字符时,比较的大小,就是字符串的大小 列举法: 1.列出所有情况 1)a[i]是大写,b[i]是小写 a[i]转换为小…

SpringBoot 集成 Nacos

目录一、前言二、Nacos集成1、引入Nacos依赖2、设置Nacos配置3、加载Nacos配置中心配置项4、Nacos集成验证5、Nacos配置中心配置项动态生效Nacos安装详见&#xff1a;Spring Cloud 系列之 Nacos 配置中心 一、前言 上一篇已经讲解了怎样安装安装、启动、配置 Nacos&#xff0c…

C++primer第八章 IO库 8.3string流

8.3string流 sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据&#xff0c;就像string是一个IO流一样。istringstream从string读取数据&#xff0c;ostringstream向string写入数据&#xff0c;而头文件stringstream既可从string读数据…

英语口语海报演讲--东软

海报 海报上的内容 Nuclear waste water 1.Damage the devastating impact of nuclear radiation on the world 2.Marine life genetically mutated or dead 3.water resources polluted water resources 4.the future of humanity genetic damage/food and environment destr…

Java中 List、Set、Map遍历方式以及性能比较

目录一、简介二、遍历方式1、ArrayList遍历方式&#xff08;1&#xff09;for循环遍历&#xff08;2&#xff09;foreach循环遍历&#xff08;3&#xff09;Iterator迭代器遍历2、LinkedList遍历方式&#xff08;1&#xff09;for循环遍历&#xff08;2&#xff09;foreach循环…

codeforces 263A-C语言解题报告

263A题目网址 题目解析 1.输入5*5的矩阵(下标从到5),包含24个0和一个1,问如何移动最小的次数(i相邻行或列)可以让1位于3行3列 举例: 输入: 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 输出: 3 注意点 1.因为数组是从0开始的,所以减2就行 row-2col-2 2.使用整型二维…

一个DEMO让你彻底理解线程池

目录一、简介二、线程池任务场景场景一&#xff1a;提交5个任务&#xff0c;执行总耗时500ms场景二&#xff1a;提交10个任务&#xff0c;执行总耗时500ms场景三&#xff1a;提交11个任务&#xff0c;执行总耗时1000ms场景四&#xff1a;提交20个任务&#xff0c;执行总耗时100…

C++primer第九章 顺序容器 9.1 顺序容器概述 9.2容器库概览

一个容器就是一些特定类型对象的集合。顺序容器(sequentialcontainer)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值&#xff0c;而是与元素加入容器时的位置相对应。与之相对的&#xff0c;我们将在第11章介绍的有序和无序关联容器&#xff0c;则根据…

SpringBoot 启动报错:Failed to configure a DataSource: ‘url‘ attribute is not specified and no emb

目录一、报错日志二、原因分析三、问题排查四、解决方案方案一&#xff1a;如果项目不需要数据库相关信息就排除此类的autoconfig方案二&#xff1a;配置文件添加数据库链接信息方案三&#xff1a;配置pom.xml中yml或者properties扫描一、报错日志 **************************…

codeforces 339A-C语言解题报告

339A题目网址 题目解析 1.输入如321的式子,升序排序(从小到大)成123 举例: 输入: 11313 输出: 11133 2.对字符串进行排序采取拍冒泡排序算法 char c0; for(i0;i<strlen(s)-1;i) {for(j0;j<strlen(s)-1;j){if(s[j]>s[j1]){cs[j];s[j]s[j1];s[j1]c;}} }代码 #includ…

C++primer第九章 顺序容器 9.3 顺序容器操作

9.3顺序容器操作 顺序容器和关联容器的不同之处在于两者组织元素的方式。这些不同之处直接关系到了元素如何存储、访问、添加以及删除。上一节介绍了所有容器都支持的操作&#xff08;罗列于表9.2&#xff08;第295页&#xff09;&#xff09;。本章剩余部分将介绍顺序容器所特…

SpringBoot 集成Nacos报错(一)

目录配置信息报错信息解决方案配置信息 <project><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version><relativePath/></parent>…