Java for循环Map集合优化实现解析
2020-02-13 11:32
627 查看
这篇文章主要介绍了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优化后的方法执行的效率比嵌套循环提高了很多很多。
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- java关于集合(list,set,map)的遍历与增强for循环的使用
- Java 实现Map集合排序功能
- Java中数组与集合的相互转换实现解析
- js模仿java的Map集合,实现功能
- java集合源码解析:map
- (11) java集合 ---- LinkedHashMap和HashMap等Map的比较使用以及 LinkedHashMap的实现原理
- Java基础知识:Java实现Map集合二级联动2
- Java集合中那些类是线程安全的 以及 Map线程安全几种实现方法
- java中Map集合、模拟斗地主洗牌发牌、JDK9对集合添加的优化
- MAP,SET,LIST,等JAVA中集合解析(了解)
- 史上最详尽 Java 8 集合类 HashMap : 底层实现和原理学习笔记(源码解析)
- java增强for循环遍历Map集合问题
- 深入Java集合学习系列:ConcurrentSkipListMap实现原理
- Java实现Map集合二级联动示例-----带界面--------------
- MAP,SET,LIST,等JAVA中集合解析(了解)
- Java Map-集合实现原理
- Java集合中:List、Set、map的区别和具体的使用场景和高频问题解析
- java中springMVC list、map集合的参数绑定、自定义类型转换器的实现
- Set、Map集合案例代码实现-Java基础学习总结
- Java>Map集合>>Map集合遍历方法_使用Entry对象遍历(迭代器遍历、增强for循环遍历)