当前位置:  开发笔记 > 编程语言 > 正文

Java自动装箱和数学表达式?

如何解决《Java自动装箱和数学表达式?》经验,为你挑选了1个好方法。

我想当我读到Joshua Bloch的Effective Java时,我的印象是出于性能原因应该避免自动装箱.但是我得到了相互矛盾的信息,我可以信任编译器使用,valueOf()并且intValue()当我进行隐式转换时最佳.

所以我在下面编写了这段代码

Integer capacity = 50103;
Integer inventory = 40122;

int available = capacity - inventory;  

从理论上讲,它将编译为与下面的代码相同的字节码.

Integer capacity = Integer.valueOf(50103);
Integer inventory = Integer.valueOf(40122);

int available = capacity.intValue() – inventory.intValue();

这是Java 7和8的真实情况吗?是否有任何理由明确选择/取消框,或者编译器现在会优化吗?



1> Tunaki..:

这不是优化,它只是相同的代码,编写的方式不同,但编译为相同的字节代码.

具有以下内容:

Integer capacity = 50103;
Integer inventory = 40122;
int available = capacity - inventory;  

两个整数值首先被装入一个Integer.然后将它们取消装箱int以执行减法.这完全等同于第二段代码.

在这些情况下,没有特别的理由明确地列出值.最好让编译器这样做,因为它提供了更短,更易读的代码.

这是您的第一个示例(JDK 1.8.0_60)生成的字节码:

 0: ldc           #2      // int 50103
 2: invokestatic  #3      // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
 5: astore_1
 6: ldc           #4      // int 40122
 8: invokestatic  #3      // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
11: astore_2
12: aload_1
13: invokevirtual #5      // Method java/lang/Integer.intValue:()I
16: aload_2
17: invokevirtual #5      // Method java/lang/Integer.intValue:()I
20: isub
21: istore_3
22: getstatic     #6      // Field java/lang/System.out:Ljava/io/PrintStream;
25: iload_3
26: invokevirtual #7      // Method java/io/PrintStream.println:(I)V
29: return

在那里你可以清楚地看到第一个片段被编译为与第二个片段相同的片段.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有