当需要对两个集合进行相互操作的时候,一般需要进行双层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. Mac OS Sierra安装源不能设置任何来源(anywhere)

    执行命令 sudo spctl --master-disable 此时再打开 System Preferences -> Security&Privacy 即可看到Anywhere

  2. Python全栈-magedu-2018-笔记8

    第四章 - IPython 使用 帮助 ? Ipython的概述和简介 help(name) 查询指定名称的帮助,是python帮助 obj? 列出obj对象的详细信息 obj?? 列出更加详细的信息 ...

  3. C++标准库algorithm

    (1) 基本数学相关: max(t1, t2)和min(t1, t2), 返回t1和t2中的较大.较小者. max_element(b, e)和min_element(b, e), 返回两个迭代器所指 ...

  4. 使用sysbench压测磁盘io

    Ⅰ.sysbench安装 cd /usr/local/src yum -y install make automake libtool pkgconfig libaio-devel git clone ...

  5. Tengine+Lua+GraphicsMagick

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! 使用 Tengine+Lua+GraphicsMagick 实现图片自动裁剪缩放 需求 : 图片 ...

  6. FastJson:Json树的CRUD操作方法实现

    准备工作:json字符串 [{ "id": 1, "code": "FLOW_NODE_1", "name": &quo ...

  7. Tomcat出现端口占用错误

    Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already in use. The ...

  8. 如何成功安装旧版本火狐,成功安装firebug和firepath插件

    很久不用火狐了,为了练习selenium定位浏览器等操作,下载了火狐浏览器,新版火狐已经没有firebug和firepath等插件,无法使用,只有安装老版本的火狐:*****安装好之后立刻设置不让他自 ...

  9. NSRunLoop 在mac command line tool上的部分运用

    首先RunLoop相关博客参考这篇https://blog.csdn.net/lengshengren/article/details/12905627. 最近开发了一个mac上的命令行工具,我在主线 ...

  10. hook

    hook的定义 hook,钩子,勾住系统的程序逻辑. 在某段SDK源码逻辑执行的构成中,通过代码手段拦截执行该程序,加入自己的代码逻辑 使用价值 hook是安卓面向切面(aop)编程的基础,可以让我们 ...