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

2023-12-18 12:36:14 浏览数 (1)

前言

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

手动装箱和自动装箱

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

代码语言:javascript复制
long l = 123;
Long L = Long.valueOf(l);

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

代码语言:javascript复制
long l = 123;
Long L = l; // 自动装箱

代码层面

代码语言:javascript复制
public class TestLong {
    public static void main(String[] args) {

        Long i = 10L;
        Long j = Long.valueOf(10);
        long n = i   j;
    }
}

编译后结果

代码语言:javascript复制
% 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_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc2_w        #7                  // long 10l
       3: invokestatic  #9                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
       6: astore_1
       7: ldc2_w        #7                  // long 10l
      10: invokestatic  #9                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      13: astore_2
      14: aload_1
      15: invokevirtual #15                 // Method java/lang/Long.longValue:()J
      18: aload_2
      19: invokevirtual #15                 // Method java/lang/Long.longValue:()J
      22: ladd
      23: lstore_3
      24: return
}

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

性能差异

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

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

性能建议

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

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

总结

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

最后

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

引用

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

0 人点赞