ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java代码性能优化小技巧

2020-11-27 13:04:19  阅读:141  来源: 互联网

标签:Java 技巧 代码 List Demo2 demo1 demo2List getName demo1List


简单总结,工作中遇到的问题,仅供参考,如出现任何问题,不接受任何投诉与反驳,哈哈。

双层循环组合数据篇

业务开发中经常会遇到两个List

List<Demo1> demo1List;
List<Demo2> demo2List;
for (Demo1 demo1 : demo1List) {
    for (Demo2 demo2 : demo2List) {
        if (demo1.getName.equals(demo2.getName())) {
            demo1.setDemo2(demo2);
        }
    }
}

以上伪代码存在两个List,且Demo1 List需要将Demo2 List中的name相同的Demo2合并进来,业务上经常会有这样的操作,假设Demo1 List大小为m,Demo2 List大小为n,则这样时间符合度则是O(m*n)

当然也有人学会了Stream API会如下实现

List<Demo1> demo1List;
List<Demo2> demo2List;
demo1List.forEach(demo1 -> {
    List<Demo2> demo2FilterList demo2List.stream().filter(demo2 -> demo2.getName().equals(demo1.getName())).collect(Collectors.toList());
    demo1.setDemo2(demo2FilterList.get(0));
})

以上的方式其实复杂度基本没有任何变化,即使计算开始了stream的parellel,只是利用的多线程优势,复杂度仍然没有进步

那……推荐的样子是什么呢?如下

List<Demo1> demo1List;
List<Demo2> demo2List;
Map<String, Demo2> demo2Map = demo2List.stream.collect(Collectors.toMap(Demo2::getName, value -> value));
demo1List.forEach(demo1 -> {
    demo1.setDemo2(demo2Map.get(demo1.getName()));
})

以上代码现将Demo2 List转换为key是name、value是Demo2对象,这样在循环Demo1 List获取对应Demo2的时候则可以利用Map数据结构复杂度O(1)的特性,此段代码复杂度则变成O(n+m+m*1),复杂度大大降低

循环内调用IO篇

review过大量的业务代码,时常会发现有在循环中调用IO的情况,包括不限于访问数据库,读写文件,甚至访问Redis等;IO操作是非常耗时的操作,对于大部分的业务系统,系统处理时间大部分都集中在IO处理上,所以应尽量避免此类操作,可采取批量读取出来,然后再使用上面的组合方法进行优化。

集合应尽量初始化容量使用篇

Java开发中会大量使用集合类,如Map,List等,而这些类大多都是有容量和自动扩容机制的,比如ArrayList的默认容量是10,HashMap的默认容量是16等,当容量达到上限则会自动扩容,扩容则会带来系统的开销,ArrayList则需要做数组拷贝,HashMap则需要rehash操作;所以在明确知道需要容量的情况下,可以在初始化阶段就指定其容量来减少大量的扩容开销,这是一个非常实用的优化手段。(注意:HashMap计算实际要使用的容量需要考虑load factor问题,所以推荐使用guava进行初始化操作)

待续…………

标签:Java,技巧,代码,List,Demo2,demo1,demo2List,getName,demo1List
来源: https://blog.csdn.net/u011539836/article/details/110228091

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有