版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/81042018

实现Java集合迭代的高性能

  • 2018.7.14
  • 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。

一、介绍

Java开发者经常会遇到处理集合(比如ArrayList、HashSet)的情况,Java 8也提供了Lambda表达式和Streaming API来简化集合相关的工作。在大多数应用场景下,无需考虑集合迭代的性能消耗。但是,在一些极端情况下,比如集合包含了上百万条记录的情况,这个时候集合迭代就需要选择正确的姿势,否则性能会较差。

使用JMH检查下面每段代码片段的运行时间。

二、forEach vs. C Style vs. Stream API

迭代是一个非常基本的功能,所有的编程语言都有简单的迭代语法,允许程序员在集合上运行迭代。Stream API可以通过Collections用非常直接的方式进行迭代。

public List<Integer> streamSingleThread(BenchMarkState state) {List<Integer> result = new ArrayList<>(state.testData.size());state.testData.stream().forEach(item -> {result.add(item);});return result;
}public List<Integer> streamMultiThread(BenchMarkState state) {List<Integer> result = new ArrayList<>(state.testData.size());state.testData.stream().parallel().forEach(item -> {result.add(item);});return result;
}

使用forEach循环也非常简单:

public List<Integer> forEach(BenchMarkState state) {List<Integer> result = new ArrayList<>(state.testData.size());for(Integer item : state.testData) {result.add(item);}return result;
}

C style方式的迭代其代码要冗长一些,但仍然非常紧凑:

public List<Integer> forCStyle(BenchMarkState state) {int size = state.testData.size();List<Integer> result = new ArrayList<>(size);for(int j = 0; j < size; j ++){result.add(state.testData.get(j));}return result;
}

以上代码的性能评分如下:

Benchmark Mode Cnt Score Error Units
TestLoopPerformance.forCStyle avgt 200 18.068 ± 0.074 ms/op
TestLoopPerformance.forEach avgt 200 30.566 ± 0.165 ms/op
TestLoopPerformance.streamMultiThread avgt 200 79.433 ± 0.747 ms/op
TestLoopPerformance.streamSingleThread avgt 200 37.779 ± 0.485 ms/op

对于C style方式的迭代,JVM只是简单地增加了一个整型变量,它直接从内存读值。这使它非常快。但forEach迭代则不同,根据Oracle官方文档,JVM必须把forEach转换为迭代器并为每个数据项调用hasNext()。这就是为什么forEach比C style

实现Java集合迭代的高性能相关推荐

  1. JAVA集合迭代遍历和特性介绍

    数组.集合:都是一种容器,用一个对象管理多个对象:数组不能自动增长:只能存放同类型的元素 集合能自动扩容:部分集合允许存放不同类型的元素: 1.List: 有顺序的,允许存放重复的元素: 遍历:for ...

  2. java集合之trove4j高性能集合库

    简介 Trove是一个java Collection集合工具类,编写程序时使用便捷.占内存少的特点,下面我们逐一介绍. 使用便捷 maven工程pom.xml文件引入所需要依赖额jar包,非maven ...

  3. java trove_trove4j高性能Java集合库

    trove4j是一个高性能的Java集合库,在服务端和客户端工作更快,使用更少的内存. 1.快速,轻量的实现了java.util.Collections API,可以与JDK中的集合框架等价使用. 2 ...

  4. JAVA集合案例之使用Iterator迭代遍历输出企鹅信息升级版

    JAVA集合案例之使用Iterator迭代遍历输出企鹅信息升级版 安静的夜晚,总是让人充满学习的激情~~又到了分享一天中学习心得的时间了,今天我来说一下集合中比较典型的案例==使用HashMap存储企 ...

  5. 开源的高性能Java集合:GNU Trove介绍

    看过openNLP源码的人或许会注意到代码里经常引入import gnu.trove.*; 好奇之余,进行了资料搜集和总结. Trove 是一个快速.轻量级 Collection 类的集合.Trove ...

  6. java集合框架史上最详解(list set 以及map)

    title: Java集合框架史上最详解(list set 以及map) tags: 集合框架 list set map 文章目录 一.集合框架总体架构 1.1 集合框架在被设计时需满足的目标 1.2 ...

  7. 1.1 JAVA集合

    Java 集合框架 集合框架被设计成要满足以下几个目标. 该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的. 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操 ...

  8. java fastutil_具有FastUtil的精简Java集合

    java fastutil 针对我最近在GNU Trove库上发表的< 发现Java原始资源集合的处理 >一书 , TheAlchemist指出了fastutil优于trove的一些优点: ...

  9. 具有FastUtil的精简Java集合

    针对我最近在GNU Trove库上发表的< 发现Java原始资源集合的处理 >一书 , TheAlchemist指出了fastutil优于trove的一些优点:"我更喜欢fast ...

最新文章

  1. 参展神器| 算法告诉你优先参加哪个会展
  2. c语言程序上级考试答案,[转载]计算机C语言二级上级考试套题(二)
  3. android ListView布局之二(是用simpleAdapter绑定数据)
  4. Java格式化日期和时间模式占位符
  5. leetcode514. 自由之路(dp)
  6. 自学python 编程基础知识_python学习-基础知识-1
  7. phpcmsV9框架:安装教程
  8. 分享一下字节面试和华为面试,希望我失败经验能为大家铺铺路
  9. scrapy配合selenium爬取需要反复操作同一个动态页面的方法,解决点击“下一页”但是URL相同的网站
  10. dell服务器启动顺序如何设置_如何即时设置一个静态文件服务器
  11. Jquery Ajax 请求示例
  12. Verilog设计实例(1)线性反馈移位寄存器(LFSR)
  13. srs之服务搭建+OBS推流(简单记录)
  14. 浩海技术激活工具可激活Windows10系统和office
  15. 有机酸膜分离之柠檬酸生产应用反渗透技术
  16. 及时输出_《奇葩说》大王逆袭开挂:真正会学习的人,都拥有输出这条管道
  17. 牛客网 赛码在线编程中数据读取问题
  18. 用户画像 | 标签数据存储之Elasticsearch真实应用
  19. 超好用的鼠标增强软件:Smooze for Mac
  20. 互联网产品都是怎么做推广的?(app产品推广)

热门文章

  1. multipathd: sdn: readsector0 checker reports path is down 多路径出错问题解决
  2. TextWatcher() 的用法
  3. android Lint优化代码
  4. C/C++基本类型字节
  5. Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性
  6. conda重命名环境env
  7. 配置使用EF6.0常见的一些问题及解决方案
  8. myeclipse 9.0安装 vss1.6.2不显示问题
  9. (转)javascript实现导出Word、Excel
  10. CentOS 8 正式发布