论使用HashMap优化双层For循环的实际性能
当需要对两个集合进行相互操作的时候,一般需要进行双层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循环的实际性能的更多相关文章
- 还在用双层for循环吗?太慢了
前情提要 我们在开发中经常碰到这样的场景,查出两个 list 集合数据,需要根据他们相同的某个属性为连接点,进行聚合.但是平时我们使用的时候关注过性能吗?下面让我们一起来看看它的表现如何. 来个例子 ...
- NGUI ScrollView 循环 Item 实现性能优化
今天来说说一直都让我在项目中头疼的其中一个问题,NGUI 的scrollView 列表性能问题,实现循环使用item减少性能上的开销. 希望能够给其他同学们使用和提供一个我个人的思路,这个写的不是太完 ...
- 高效遍历匹配Json数据与双层for循环遍历Json数据
工作中往往遇到这种情况,保留用户操作痕迹,比如用户选择过得东西,用户进入其它页面再返回来用户选择的的数据还在. 比如:1.购物车列表中勾选某些,点击任意一项,前往详情页,再返回购物车依旧需要呈现勾选状 ...
- C++ 退出双层for循环,解决 break、return、continue无法实现问题
遇到一个情景,采用双层for循环 遍历图像的像素,当找到某一个像素点满足条件时,退出双层for 循环 . 首先了解一下 continue.break.return 各自功能用法: 1.continue ...
- js实现99乘法表的编写(双层for循环与递归方法)
双层for循环实现方法: function nine (num) { ; i <= num; i++){ var str = ''; ; k <= num; k++){ if(i > ...
- TI C6000 优化进阶:循环最重要!
软件流水循环 1. C6000流水线(Pipeline) 一个指令的处理过程并不是一步完成,它被分为三个阶段:取指(Fetch).译码(Decode).执行(Excute).将每一个阶段放入独立的流程 ...
- 3Sum Time Limit Exceeded HashMap 优化过程
昨晚,在做leetcode上的3Sum题目时,感觉这道题目和2Sum很像,当时解决2Sum时,思路如下: 用HashMap的key存储 num[i],value存储下标 i,之后在遍历数组num时,判 ...
- Python 三级菜单与优化(一层循环嵌套)
优化的思路是使用单层循环嵌套完成三级菜单,这个优化思路我非常喜欢,我喜欢在编程的时候用最少的东西写出同样的效果,通常这样会绕来绕去,但非常有趣!!! 需求: 1.运行程序输出第一级菜单: 2.选择一级 ...
- MySQL的JOIN(三):JOIN优化实践之内循环的次数
这篇博文讲述如何优化内循环的次数.内循环的次数受驱动表的记录数所影响,驱动表记录数越多,内循环就越多,连接效率就越低下,所以尽量用小表驱动大表.先插入测试数据. CREATE TABLE t1 ( i ...
随机推荐
- python获取文件所在目录
1.执行的python程序获取自己文件所在目录 import os,sys os.chdir(sys.path[0]); dir_name = os.path.abspath(os.path.join ...
- 我了解到的新知识之----遇到路由器DNS被篡改我该怎么办?
最近一则新闻让我不得不开始重视家中一直沉默在角落里路由器了. http://www.21ic.com/tougao/article/8346.html 于是立刻搜索了一些关于如何检查DNS地址是否被修 ...
- 将win7 设置为 NTP服务器
1. 修改注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer Enabl ...
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165317
第一周作业 Kali的安装 Kali的下载 从kali官网下载kali-linux 64-bit 版本. Kali的安装 由于在娄老师的课上使用virtualbox, 所以我习惯性使用virtual ...
- java -cp通配符
JDK6支持java -cp后面跟通配符'*',试了一下发现还是需要注意: 错误方式(Wrong way): java -cp /data/apps/lib/*.jar com.chinacache ...
- jmeter 之调试
目前知道的调试方法有两种:debug sample .http mirror server debug sample debug sample 的用户界面如下: 如果选择ture则表示打印对应的数据 ...
- Linux协议栈-netfilter-conntrack
原文连接:https://blog.csdn.net/jasonchen_gbd/article/details/44874321?utm_source=blogxgwz8
- UISplitViewController使用
分割控制器UISplitViewController <1>功能:它也是ipad的一个新特性,在屏幕上可以同时显示两个控制器,左边一个,右边一个:左边的为主控制器,右边的为详细控制器,主控 ...
- #学号 20175201张驰 《Java程序设计》第2周学习总结
教材学习内容总结: 一.第二章: 1:标识符与关键字 2:基本数据类型:四种整数类型(byte.short.int.long).两种浮点数类型(float.double).一种字符类型(char).一 ...
- Go语言 切片长度和容量
package main import "fmt" func main() { s := []int{2, 3, 5, 7, 11, 13} printSlice(s) // Sl ...