当需要对两个集合进行相互操作的时候,一般需要进行双层For循环,但我们知道双层For在数量越大的时候性能影响越大

这时候我们会想到的其中一种解决方法就是利用Hashmap在查找数据的高效上来优化双层For

我利用下面的代码来模拟测试两种情况的性能:

public static void main(String[] args) {

        for (int i = 0; i < 10000; i += 10) {
List<String> loopList1 = getLoopList(i);
List<String> loopList2 = getLoopList(i);
long loopBy2forTimes = doBy2ForLoop(loopList1, loopList2);
long loopByHashMapForTimes = doByHashmapForLoop(loopList1, loopList2);
System.out.println("size:" + i + ": " + loopBy2forTimes + "," + loopByHashMapForTimes);
} for (int i = 10000; i < 100000; i += 10000) {
List<String> loopList1 = getLoopList(i);
List<String> loopList2 = getLoopList(i);
long loopBy2forTimes = doBy2ForLoop(loopList1, loopList2);
long loopByHashMapForTimes = doByHashmapForLoop(loopList1, loopList2);
System.out.println("size:" + i + ": " + loopBy2forTimes + "," + loopByHashMapForTimes);
}
} private static List<String> getLoopList(int size) {
List<String> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
list.add(String.valueOf(i));
}
return list;
} private static long doBy2ForLoop(List<String> loopList1, List<String> loopList2) {
long startTime = System.currentTimeMillis(); for (String str1 : loopList1) {
for (String str2 : loopList2) {
if (str1.equals(str2)) {
continue;
}
}
}
long endTime = System.currentTimeMillis();
return endTime - startTime;
} private static long doByHashmapForLoop(List<String> loopList1, List<String> loopList2) {
long startTime = System.currentTimeMillis();
Map<String, String> loopListMap = loopList2.stream().collect(Collectors.toMap(k -> k, Function.identity()));
for (String str1 : loopList1) {
String str2 = loopListMap.get(str1);
}
long endTime = System.currentTimeMillis();
return endTime - startTime;
}

结果: 第一个表格为1~10000, 第二个表格为10000~100000,

可以看到双层For数据量越大,执行时间越长,而使用了Hashmap,纵使数据量增长到了10w,执行时间也几乎为0(3-4ms)

嘛当然我们也可以算出上述代码的双层For的时间复杂度为O((1+N)/2),而使用Hashmap的时间复杂度为O(1),也可以发现List转Map几乎不耗时间

但是也要注意到,在数据量低(<2000)的情况下,两者没有区别,而hashmap还需要占用多余的空间

结论:选择哪个来遍历还是需要看具体的场景的数据量(但是数据量不清又嫌麻烦的咱大部分情况还是会用hashmap大法了233)

论使用HashMap优化双层For循环的实际性能的更多相关文章

  1. 还在用双层for循环吗?太慢了

    前情提要 我们在开发中经常碰到这样的场景,查出两个 list 集合数据,需要根据他们相同的某个属性为连接点,进行聚合.但是平时我们使用的时候关注过性能吗?下面让我们一起来看看它的表现如何. 来个例子 ...

  2. NGUI ScrollView 循环 Item 实现性能优化

    今天来说说一直都让我在项目中头疼的其中一个问题,NGUI 的scrollView 列表性能问题,实现循环使用item减少性能上的开销. 希望能够给其他同学们使用和提供一个我个人的思路,这个写的不是太完 ...

  3. 高效遍历匹配Json数据与双层for循环遍历Json数据

    工作中往往遇到这种情况,保留用户操作痕迹,比如用户选择过得东西,用户进入其它页面再返回来用户选择的的数据还在. 比如:1.购物车列表中勾选某些,点击任意一项,前往详情页,再返回购物车依旧需要呈现勾选状 ...

  4. C++ 退出双层for循环,解决 break、return、continue无法实现问题

    遇到一个情景,采用双层for循环 遍历图像的像素,当找到某一个像素点满足条件时,退出双层for 循环 . 首先了解一下 continue.break.return 各自功能用法: 1.continue ...

  5. js实现99乘法表的编写(双层for循环与递归方法)

    双层for循环实现方法: function nine (num) { ; i <= num; i++){ var str = ''; ; k <= num; k++){ if(i > ...

  6. TI C6000 优化进阶:循环最重要!

    软件流水循环 1. C6000流水线(Pipeline) 一个指令的处理过程并不是一步完成,它被分为三个阶段:取指(Fetch).译码(Decode).执行(Excute).将每一个阶段放入独立的流程 ...

  7. 3Sum Time Limit Exceeded HashMap 优化过程

    昨晚,在做leetcode上的3Sum题目时,感觉这道题目和2Sum很像,当时解决2Sum时,思路如下: 用HashMap的key存储 num[i],value存储下标 i,之后在遍历数组num时,判 ...

  8. Python 三级菜单与优化(一层循环嵌套)

    优化的思路是使用单层循环嵌套完成三级菜单,这个优化思路我非常喜欢,我喜欢在编程的时候用最少的东西写出同样的效果,通常这样会绕来绕去,但非常有趣!!! 需求: 1.运行程序输出第一级菜单: 2.选择一级 ...

  9. MySQL的JOIN(三):JOIN优化实践之内循环的次数

    这篇博文讲述如何优化内循环的次数.内循环的次数受驱动表的记录数所影响,驱动表记录数越多,内循环就越多,连接效率就越低下,所以尽量用小表驱动大表.先插入测试数据. CREATE TABLE t1 ( i ...

随机推荐

  1. Hibernate-day03

    双向的many2one/one2many 双向many2one/one2many的问题:一定有额外的SQL发出;在数据库里面,外键表示many2one或者one2many的关系,外键是没有方向的;但是 ...

  2. 使用Xilinx UART-LITE IP实现串口--逻辑代码实现

    `timescale 1ns / 1ps /////////////////////////////////////////////////////////////////////////////// ...

  3. linux CentOS 安装 nginx+tomcat+java+mysql运行环境

    本文介绍了CentOS7 64 Java,Tomcat,MySQL,Maven热部署等服务器环境的搭建过程. 服务器: 已经将所需要的工具(Xshell,Xftp.FileZilla等sftp上传工具 ...

  4. 转载,matla滤波函数

    转载地址http://blog.sina.com.cn/s/blog_6163bdeb0102e1dj.html 滤波器设计是一个创建满足指定滤波要求的滤波器参数的过程.滤波器的实现包括滤波器结构的选 ...

  5. 【JVM】-NO.113.JVM.1 -【JDK11 HashMap详解-4-resize()】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  6. JAVA反射机制及理解

    JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...

  7. JMeter-性能测试监控(解决.sh文件的启动)

    下载插件 https://jmeter-plugins.org/downloads/old/ 已安装了jmeter-plugins-manager,装的这个不知道生没生效.... 2.问题:启动就显示 ...

  8. 关于网站的一些js和css常见问题的记录

    1. 文字超过宽度,给这个后面超过的文字用...来表示  white-space: nowrap;

  9. TextField widgets require a Material widget ancestor

    TextField widget需要被包裹在Scaffold widget中,否则会报错

  10. eval() 和 int()区别,以及eval作用

    eval()方法作用是将数据转换回原本的类型 a = str(list) type(a)--->str eval(a) type(a)--->list