当前位置: 首页 > news >正文

聊聊long类型装箱和拆箱性能问题

前言

这个主题主要讨论Java中long类型自己手动装箱和系统自动装箱的性能问题,在Java中,long类型是基本数据类型,Long类型是long的包装类。

手动装箱和自动装箱

手动装箱:通过直接调用Long的valueOf方法,将long装箱为Long

long l = 123;
Long L = Long.valueOf(l);

自动装箱:编译器会自动将基本类型装箱为包装类

long l = 123;
Long L = l; // 自动装箱

代码层面

public class TestLong {public static void main(String[] args) {Long i = 10L;Long j = Long.valueOf(10);long n = i + j;}
}

编译后结果

% javac TestLong.java
% javap -c TestLong  
警告: 文件 ./TestLong.class 不包含类 TestLong
Compiled from "TestLong.java"
public class com.check.TestLong {public com.check.TestLong();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: ldc2_w        #7                  // long 10l3: invokestatic  #9                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;6: astore_17: ldc2_w        #7                  // long 10l10: invokestatic  #9                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;13: astore_214: aload_115: invokevirtual #15                 // Method java/lang/Long.longValue:()J18: aload_219: invokevirtual #15                 // Method java/lang/Long.longValue:()J22: ladd23: lstore_324: return
}

从上面的编译结果来看,不管你是否进行了装箱,他都会调用装箱,所以无需担心有额外的性能开销。

性能差异

手动装箱:需要直接调用函数,有一定的性能开销

自动装箱:编译器优化,装箱的开销很小

性能建议

所以从性能角度,自动装箱要优于手动装箱。但是两者的差异也不是特别大,除非在高性能关键代码中,或者装箱的操作非常频繁,对于绝大多数情况,使用自动装箱就可以了。

所以通常建议使用自动装箱,让编译器优化,而不是手动装箱。只有在对性能要求极高的场景中,如果经过测试发现装箱的开销确实很大,才需要考虑手动优化。

总结

在Java中,手动装箱指的是使用Long.valueOf()方法将long基本类型转换为Long对象,而系统自动装箱是指在需要Long对象的地方直接使用long基本类型。性能上,手动装箱会比系统自动装箱更高效,因为手动装箱避免了自动装箱过程中的额外对象创建和内存分配操作。因此,在对性能敏感的场景中,可以考虑使用手动装箱来提升效率。

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!

引用

https://www.cnblogs.com/dolphin0520/p/3780005.html

相关文章:

  • TCP/IP 四层体系结构
  • 如何通过TortoiseGit可视化工具查看Git管理的版本树和信息(工作树变更)内容
  • 不同的葡萄酒瓶盖会影响葡萄酒饮用的体验
  • 【程序】STM32 读取光栅_编码器_光栅传感器_7针OLED
  • 基于ASF-YOLO融合空间特征和尺度特征的新型注意力尺度序列融合模型开发构建医学场景下细胞分割检测识别系统,以【BCC、DSB2018数据集为基准】
  • wpf TelerikUI使用DragDropManager
  • Kotlin ArrayList类型toTypedArray转换Array
  • RHEL8_Linux使用podman管理容器
  • 贝蒂详解<string.h>哦~(用法与实现)
  • KubeKey 离线部署 KubeSphere v3.4.1 和 K8s v1.26 实战指南
  • JVM 调优
  • 大华 DSS 数字监控系统 itcBulletin SQL 注入漏洞复现
  • 软件测试计划文档
  • 论文写作☞结论怎么写?
  • maui中实现加载更多 RefreshView跟ListView(1)
  • Java知识点总结(JavaIO-打印流)
  • Laravel Telescope:优雅的应用调试工具
  • PAT A1120
  • Promise面试题,控制异步流程
  • Python学习之路16-使用API
  • React组件设计模式(一)
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 使用 QuickBI 搭建酷炫可视化分析
  • 为什么要用IPython/Jupyter?
  • 写给高年级小学生看的《Bash 指南》
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #微信小程序(布局、渲染层基础知识)
  • (13)Hive调优——动态分区导致的小文件问题
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (floyd+补集) poj 3275
  • (二)JAVA使用POI操作excel
  • (二)windows配置JDK环境
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)ObjectiveC 深浅拷贝学习
  • .NET Core 成都线下面基会拉开序幕
  • .NET Remoting学习笔记(三)信道
  • .Net的DataSet直接与SQL2005交互
  • .NET中GET与SET的用法
  • /etc/sudoer文件配置简析
  • @staticmethod和@classmethod的作用与区别
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [20171106]配置客户端连接注意.txt
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [CTO札记]如何测试用户接受度?
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [Leetcode] Permutations II