论使用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)

原文地址:https://www.cnblogs.com/syui-terra/p/10163117.html

时间: 2024-10-13 20:32:36

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

使用Map优化双层For循环

笔者在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map高效的查询性能来优化双层for循环. 如果小循环和大循环的集合元素数量分别为M和N,则双层For循环的循环次数是M*N,随着M和N的增长,对性能的影响越来越大.因此,本文考虑进一步优化.利用下面的代码来模拟测试两种情况的性能: import java.util.ArrayList; import java.util.List; import java.util

跳出Java当中的一些循环,跳出双层FOR循环

今天写代码写了个双层的for循环,里面还是用来Iterator,大致意思就是在第二个循环中如果符合条件就给跳出整个双层循环. 刚开始,直接使用break.巴拉巴拉的敲了一堆代码,信心满满的就直接运行.等到结果一看,这不是要我要的.哎··看来不扎实呀! 突然来了兴趣,索性就看看一些资料,总结了几种跳出循环的方式: 1.直接跳出循环: for (int i = 0; i < 10; i ++) { if(i == 4) { break; } System.out.println(i); } Syst

C语言优化实例:循环中减少判断

为了让编译器更好地优化循环,应该尽量让循环中减少判断,方法之一是将判断语句整合进表达式.还是这个例子: for (int i = 0; i < 1000*10; i++) { sum += data[i/1000][i%10]; } 假如我们需要加一个判断,只有非负整数才需要作求和运算: for (int i = 0; i < 1000*10; i++) { if (data[i/1000][i%10] >= 0) sum += data[i/1000][i%10]; } 下面将这个判断

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

工作中往往遇到这种情况,保留用户操作痕迹,比如用户选择过得东西,用户进入其它页面再返回来用户选择的的数据还在. 比如:1.购物车列表中勾选某些,点击任意一项,前往详情页,再返回购物车依旧需要呈现勾选状态           2.勾选人员后,前往别的页面,再次返回,人员依旧程勾选状态           3.等等.... 解决方法:1.把用户选择的数据在本地保存一份 2.进入当前页面拿缓存数据和新数据(从后台获取的数据)进行对比,然后进行对比渲染 在做数据比对的时候,可以通过嵌套for循环,一层f

js流程控制语句--利用双层for循环实现九九乘法表和五角星

js中的流程控制语句:顺序结构 分支结构 循环结构 分支结构:1.if语句 --适用于范围性的判断 语法:if(条件){语句}--如果条件成立 就执行语句           if(条件){语句1}else(){语句2} 如果条件成立 执行语句1,否则执行语句2           if(条件){语句1}else if(){语句2}else(){语句3} 2.三元运算符:只适用于比较简单的判断,可以更加简洁 语法:var 结果=条件?A:B 如果条件满足就是A否则就是B 3.switch....

php 性能优化之php 语言级的性能优化一

对于这个问题首先我们要知道影响php的性能的原因是什么?也就是 1 什么情况下会出现php性能问题? 1php语法使用不当(包括某些业务可以使用php 本身自带的函数来处理) 2使用php语言做了它不擅长的事 3用php语言链接的服务器不给力(当然如果是localhost也就是你本地配置比较差哈,建议换本吧,哈哈) 4php自身的短板 (PHP 自身就做不了) 5我们也不知道的问题 (囧)   2 php 性能问题简介之php的性能问题的解决方向 从困难度由浅到深分别为: 1 Php 语言级的性

Write Optimized B-Trees:优化B树索引的写性能

本文主要是笔者作报告的PPT,主要讲解优化B树索引的写性能(同时尽可能不损失读性能),PPT并不长,相信能使人较快领会这篇论文的思想.

优化临时表使用,SQL语句性能提升100倍

[问题现象] 线上mysql数据库爆出一个慢查询,DBA观察发现,查询时服务器IO飙升,IO占用率达到100%, 执行时间长达7s左右.SQL语句如下:SELECT DISTINCT g.*, cp.name AS cp_name, c.name AS category_name, t.name AS type_name FROMgm_game g LEFT JOIN gm_cp cp ON cp.id = g.cp_id AND cp.deleted = 0 LEFT JOIN gm_cate

OutputCache缓存优化asp.net代码 提高网页性能

对于asp.net编写的网页来说,使用缓存是一种非常重要也是很常用的优化技术,它可以大大减轻服务器的负载压力,优化这些网页的性能,在网与使用 .NET Framework 的任何其他功能相比,适当地使用缓存可以更好地提高站点的性能.同时,在网页加速显示上也起了很大的作用. OutputCache以声明的方式控制 ASP.NET 页或页中包含的用户控件的输出缓存策略. 语法: <%@ OutputCache Duration="#ofseconds"   Location=&quo