java 6种深拷贝集合方式及其性能差异对比

文章目录

    • ArrayList 构造方法拷贝
      • 运行1000次耗时 1ms
    • for循环拷贝
      • 运行1000次耗时 14ms
    • Stream流 collect实现拷贝
      • 运行1000次耗时 54ms
    • Stream流+spring的BeanUtils实现拷贝
      • 运行1000次耗时 2468 ms
    • Hutool工具实现拷贝
      • Hutool 5.7.13版本运行1000次耗时 64674 ms
      • Hutool 5.8.24版本运行1000次耗时 15874 ms
    • 结论

测试背景
在项目中很多地方需要拷贝对象集合、A类型对象的集合转换到B类型这种操作,但是这种操作的完成是有各种写法的,每种写法的性能可能不一样,因此对比一下各个写法的性能差异,选择最优解。
对一个有1000个对象的List复制1000次
ActivityCouponVO 对象有35个字段,各类型都有

	/**
     * 集合大小
     */
    private int len = 1000;
    /**
     * 循环次数
     */
    private int loop = 1000;
	List<ActivityCouponVO> getList(int len){
     // ... 生成一千个这个对象的集合,且每个字段赋值了
}

测试方法完整代码示范如下,后续各种方式的代码只写一次复制的代码示意,不写外层循环和耗时打印这些了
在这里插入图片描述

ArrayList 构造方法拷贝

底层使用了Arrays.copyOf()方法,这个方法底层又用了System.arraycopy方法,这个方法是native方法,使用本地实现,(一般为c++),直接操作内存复制,效率高

List<ActivityCouponVO> list = getList(len);
ArrayList<ActivityCouponVO> activityCouponVOS = new ArrayList<>(list);

运行1000次耗时 1ms

for循环拷贝

			List<ActivityCouponVO> list = getList(len);
			List<ActivityCouponVO> collect = new ArrayList<>(len);
            for (ActivityCouponVO activityCouponVO : list) {
                collect.add(activityCouponVO);
            }

运行1000次耗时 14ms

Stream流 collect实现拷贝

List<ActivityCouponVO> list = getList(len);
List<ActivityCouponVO> collect = list.stream().collect(Collectors.toList());

运行1000次耗时 54ms

Stream流+spring的BeanUtils实现拷贝

List<ActivityCouponVO> list = getList(len);
List<ActivityCouponVO> activityCouponVOS = list.stream().map(o -> {
                ActivityCouponVO activityCouponVO = new ActivityCouponVO();
                BeanUtils.copyProperties(o, activityCouponVO);
                return activityCouponVO;
            }).collect(Collectors.toList());

运行1000次耗时 2468 ms

Hutool工具实现拷贝

List<ActivityCouponVO> list = getList(len);
List<ActivityCouponVO> activityCouponVOS = BeanUtil.copyToList(list, ActivityCouponVO.class);

Hutool 5.7.13版本运行1000次耗时 64674 ms

(看了下源码是因为加锁了)

Hutool 5.8.24版本运行1000次耗时 15874 ms

(新版本里没有加锁了,而且还做了优化,例如properties缓存)

结论

建议使用
Arrays.copyOf()
System.arraycopy
这种本地实现的拷贝数组方式,其次可以使用for循环、stream流、BeanUtils工具等方式实现,但是要注意使用工具的时候看看工具的源码实现,有可能里面有锁,然后有性能的坑~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/294218.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

芯片金线包封胶的使用注意事项是什么?

芯片金线包封胶的使用注意事项是什么?金线包封胶是一种高性能、高粘度的密封胶&#xff0c;广泛应用于电子、电器、汽车等领域。它具有良好的防水、防潮、防震等性能&#xff0c;能够保护产品内部零件不受环境影响&#xff0c;提高产品的使用寿命。然而&#xff0c;在使用金线…

记一次RabbitMQ服务器异常断电之后,服务重启异常的处理过程

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 机房突然停电&#xff0c;rabbitmq的主机异常断电&#xff0c;集群服务全部需要重启。但是在执行service…

热泵,预计到2025年市场规模将达到650亿美元

热泵是一种利用空气、水、地热等低品位能源&#xff0c;转化为高品位热能&#xff0c;提供供暖、热水和冷却等服务的热力设备。近年来&#xff0c;热泵市场逐步发展壮大&#xff0c;成为新能源市场的重点发展领域。全球市场分析&#xff1a; 近年来&#xff0c;全球绿色环保理念…

QT上位机开发(动态库dll的开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 有的时候&#xff0c;我们不想把所有的代码都放在一个exe里面&#xff0c;这个时候我们就需要引入dll动态库的概念。在windows平台上面&#xff0c…

接口测试测什么?一个简单问题把我难住了!

那么设计测试用例时我们主要考虑如下几个方面&#xff1a; 01、功能测试 接口的功能是否正确实现了 接口是否按照设计文档中来实现 &#xff08;比如username参数写为了user&#xff0c;那么这就不符合&#xff0c;因为接口文档在整个开发中都需要使用&#xff0c;所以接口实…

Spss Amos 28安装包下载及安装教程

Amos 28下载链接&#xff1a;https://docs.qq.com/doc/DUnhwUXFnTGtyRnJ1 1.鼠标右键解压到“Amos 28” 2.选中Setup&#xff0c;鼠标右击选择“以管理员身份运行” 、3.点击“Next” 4.选择I accept the terms in the license agreement&#xff0c;点击“Next” 5.选择软件安…

Centos7.9或Deebian12安装K3s和k9s详细流程

1、在线安装k3s 安装的版本为&#xff1a;v1.23.15k3s1 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRRORcn INSTALL_K3S_VERSION"v1.23.15k3s1" sh - 2、安装完成&#xff0c;测试 kubectl get nodes正常输出即没…

【教学类-综合练习-02】20231208 大3班 数字加减法练习(数字火车、X—Y加法减法、X乘法、X—Y数字分合)

教学情况 时间&#xff1a;20231208 班级&#xff1a;大3班 人数&#xff1a;21 目的&#xff1a;幼儿根据自己的能力水平&#xff0c;选择适合的数学题&#xff08;多款样式&#xff09; 在昨天大4班制作的基础上&#xff0c;特地打印一些小纸片数学题&#xff08;节省纸…

WPF DatePicker与Calendar的使用和样式修改

什么是DatePicker&#xff0c;Calendar Calendar&#xff1a;日历&#xff08;显示年月日视图控件&#xff09;DatePicker&#xff1a;日期选择器&#xff08;是一个更小的控件&#xff0c;点击控件时才会弹出一个日历&#xff09; Calendar使用 常用属性 DisplayMode&#…

【漏洞复现】通天星CMSV6车载监控平台FTP匿名访问

Nx01 产品简介 深圳市通天星科技有限公司&#xff0c;是一家以从事计算机、通信和其他电子设备制造业为主的企业。通天星车载视频监控平台软件拥有多种语言版本。应用于公交车车载视频监控、校车车载视频监控、大巴车车载视频监控、物流车载监控、油品运输车载监控、警车车载视…

基于Java SSM框架实现宠物管理系统项目【项目源码+论文说明】

基于java的SSM框架实现宠物管理系统演示 摘要 随着我国经济的快速发展&#xff0c;人民生活水平的不断提高&#xff0c;宠物逐渐成为许多宠物爱好者的一种生活方式。 宠物的品种也越来越多样化&#xff0c;宠物不仅能给生活带来乐趣还可以成为空巢老人&#xff0c;独生子女很…

windows安装kafka以及kafka管理工具推荐

windows安装 1.下载地址 下载地址 下载最新版本的.tgz文件解压 2.修改配置 修改config目录下的zookeeper.properties中的dataDir属性 server.properties文件中的log.dir属性 3.启动zookeeper 进入到bin\windows\下的用cmd输入zookeeper-server-start.bat ..\..\config\zo…

ShardingSphere-JDBC初探

引言 为什么使用分库分表&#xff1f; 数据量太大单表放不下&#xff0c;并且公司不希望切换产品&#xff0c;可选的方案不多&#xff0c;ShardingSphere就是不错的选择。 切换产品指的是换成es、clickhouse、hbase这种支持大数据&#xff0c;试想一下切换产品对整个项目的改…

ChatGPT 进行 SEO的使用技巧

搜索引擎优化 (SEO) 是使网站对搜索引擎友好的一种不断发展的实践。 自搜索引擎和新兴技术的发展以来&#xff0c;它从未保持不变。 最近发布的 ChatGPT 是一种人工智能对话工具&#xff0c;似乎在搜索引擎优化方面有很好的应用。 从创建吸引人的标题到只需一个简短的提示就可…

vivado license申请

AMD: Product Licensing

一分钟全方位认识飞速创软

公司简介 飞速软创专注于面向研发团队的一体化研发平台产品&#xff0c;倾力打造集高效与智能于一体的一体化研发平台产品。其根基深植于深圳这座科技之城&#xff0c;并已将业务版图拓展至北京、上海、珠海及香港等地&#xff0c;通过设立分公司和办事处&#xff0c;全方位覆盖…

音乐制作软件Studio One mac有哪些特点

Studio One mac是一款专业的音乐制作软件&#xff0c;该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件特点 1. 直观易用的界面&…

胎牛血清,预计2028年达到27.5亿美元以上

胎牛血清是从胎牛的脐带或心脏中提取出的一种高营养的医疗用品。本文将从全球市场和中国市场两方面进行分析其发展趋势。 全球市场分析&#xff1a;胎牛血清在药品和生物科技行业中有着广泛的应用&#xff0c;如细胞培养、疫苗制备、诊断试剂盒和治疗药物等。随着生物技术的不断…

多台西门子PLC对接Oracle数据库,实现PLC与数据库双向数据通讯

智能网关IGT-DSER方便实现多台PLC与数据库之间的数据通讯&#xff0c;既可以读取PLC的数据上报到数据库&#xff0c;也可以从数据库查询数据后写入到PLC的寄存器。 网关安装在设备侧&#xff0c;与设备同时起停&#xff0c;不担心数据丢失&#xff1b;在断网、服务器维护上报数…

淘宝以图搜商品API调用详细步骤(apiKeysecret)

以图片来搜索商品是电商平台常见的一个功能&#xff0c;一般用于搜索同款、找爆品、淘宝拍立淘等功能。 通过item_search_img可以实现通过图片来搜索同款商品列表&#xff0c;响应参数包括宝贝标题、列表类型、宝贝图片、优惠价、价格、销量、宝贝ID、商品风格标识ID、掌柜昵称…