Java for循环Map集合优化实现解析

 更新时间:2020年01月16日 11:30:55   作者:楼兰的胡杨  
这篇文章主要介绍了Java for循环Map集合优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Java for循环Map集合优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在《for循环实战性能优化》中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环。

如果小循环和大循环的集合元素数量分别为M和N,则双层For循环的循环次数是M*N,随着M和N的增长,对性能的影响越来越大。因此,本文考虑进一步优化,使得循环次数变为M+N。利用下面的代码来模拟测试两种情况的性能:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class ForUpdate {

  public static void main(String[] args) {

//    for (int i = 0; i < 10000; i += 10) {
//      loopGivenNum(i);
//    }
    for (int i = 10000; i < 100000; i += 10000) {
      loopGivenNum(i);
    }
    System.out.println("----- done -----");

  }

  private static void loopGivenNum(int i) {
    List<String> smallLoop = getLoopList(i);
    List<String> bigLoop = getLoopList(2 * i);
    long doByForTimes = doByFor(bigLoop, smallLoop);
    long doByMapTimes = doByMap(bigLoop, smallLoop);
    System.out.println("size " + i + ": " + doByForTimes + "," + doByMapTimes);
  }

  /**
   * 获取循环变量
   * @param size 循环变量元素个数
   */
  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 doByFor(List<String> bigLoop, List<String> smallLoop) {
    long startTime = System.currentTimeMillis();
    for (String str1 : smallLoop) {
      for (String str2 : bigLoop) {
        if (str1.equals(str2)) {
          continue;
        }
      }
    }
    return System.currentTimeMillis() - startTime;
  }

  /**
   * 使用 Map 优化
   * @param bigLoop
   * @param smallLoop
   */
  private static long doByMap(List<String> bigLoop, List<String> smallLoop) {
    long startTime = System.currentTimeMillis();
    // 转换成map
    Map<String, String> loopMap = bigLoop.stream().collect(Collectors.toMap(k -> k, Function.identity()));
    System.out.println(loopMap.size());
    for (String str1 : smallLoop) {
      if (loopMap.containsKey(str1)) {
        continue;
      }
    }
    return System.currentTimeMillis() - startTime;
  }
}

输出结果:

size 10000: 756,97
size 20000: 3091,8
size 30000: 4342,7
size 40000: 8848,7
size 50000: 16317,7
size 60000: 31652,7
size 70000: 37078,7

由此可见,数据量越大嵌套For循环执行时间越长,而使用Map后,纵使数据量增长到了20w,执行时间也维持在7ms左右。数据量小的时候,执行结果就不再贴出来了。

结论:使用Map优化后的方法执行的效率比嵌套循环提高了很多很多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解决RestTemplate 请求接收自定义400+ 或500+错误

    解决RestTemplate 请求接收自定义400+ 或500+错误

    这篇文章主要介绍了解决RestTemplate 请求接收自定义400+ 或500+错误,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • maven安装配置的实现步骤

    maven安装配置的实现步骤

    本文主要介绍了maven安装配置的实现步骤,包括下载和安装Maven,配置Maven的环境变量,以及创建Maven项目,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • JVM 参数配置详细介绍

    JVM 参数配置详细介绍

    这篇文章主要介绍了JVM 参数配置详细介绍的相关资料,需要的朋友可以参考下
    2017-02-02
  • Spring如何基于Proxy及cglib实现动态代理

    Spring如何基于Proxy及cglib实现动态代理

    这篇文章主要介绍了Spring如何基于Proxy及cglib实现动态代理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • java后台处理前端传的json串方法

    java后台处理前端传的json串方法

    今天小编就为大家分享一篇java后台处理前端传的json串方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • Java 多用户登录限制的实现方法

    Java 多用户登录限制的实现方法

    最近没有事情做,闲的发呆,于是写个东东练练手。这篇文章主要介绍了Java 多用户登录限制的实现方法的相关资料,需要的朋友可以参考下
    2016-11-11
  • spring 如何将配置信息注入静态变量的方法

    spring 如何将配置信息注入静态变量的方法

    本篇文章主要介绍了spring 如何将配置信息注入静态变量的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 深入探索Java常量池

    深入探索Java常量池

    这篇文章主要介绍了深入探索Java常量池,涉及静态常量池和运行时常量池的介绍,常量池的好处,8种基本数据类型的包装类和常量池等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • JAVA annotation入门基础

    JAVA annotation入门基础

    以下是JAVA annotation入门基础,新手朋友们可以过来参考下。希望对你有所帮助
    2013-08-08
  • Springboot 整合 Java DL4J 实现时尚穿搭推荐系统(实例代码)

    Springboot 整合 Java DL4J 实现时尚穿搭推荐系统(实例代码)

    本文介绍了如何使用SpringBoot和JavaDeeplearning4j框架搭建一个时尚穿搭推荐系统,文章详细阐述了系统的技术架构、数据集格式、Maven依赖配置、模型训练和预测代码实现,以及单元测试和预期输出结果
    2024-10-10

最新评论