java - 最终字符串与最终整数

标签 java

我的java类

private static final String constantString = "Constant";    
private static final Integer constantInteger = 5;
public static void main(String[] args) {
    String s2 = constantString + "append"; // LINENUMBER 9
    Integer i2 = constantInteger + 7; // LINENUMBER 10
}

字节码

 LINENUMBER 9 L0
    LDC "Constantappend"
    ASTORE 1
   L1
    LINENUMBER 10 L1
    GETSTATIC TestClass.constantInteger : Ljava/lang/Integer;
    INVOKEVIRTUAL java/lang/Integer.intValue()I
    BIPUSH 7
    IADD

问题 1:为什么编译器不将最终整数(constantInteger)值替换为 5,但对于字符串却替换了!

如果删除整型变量的final关键字

java代码:

private static Integer constantInteger = 5;

字节码:

LINENUMBER 10 L1
GETSTATIC TestClass.constantInteger : Ljava/lang/Integer;
INVOKEVIRTUAL java/lang/Integer.intValue()I
BIPUSH 7

字节码在两种不同的情况下是相同的(static final Integer,static Integer)

问题 2:那么将 Integer 设为 final 有什么用?

最佳答案

推测:原因是字符串实习。编译器会驻留字符串并优化驻留字符串的连接。但它不实习数字,显然缺乏优化。

除了没有在编译器中实现之外,我想不出它不能优化整数大小写的任何原因。正如其他答案中提到的, Integer + 涉及装箱/拆箱操作,与 string + 及其隐式 StringBuilder 优化和实习逻辑完全不同。因此,从编译器实现的角度来看,String + 优化可能是“免费”的。

关于java - 最终字符串与最终整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13431388/

相关文章:

java - 将用户输入编辑文本与 SQLite 数据库 Android Java 进行比较

java - 如何使用 "VersionOne SDK JAVA API"客户端创建缺陷

java - Kafka生产者拦截器

java - 如何在 Java GUI 中使用鼠标光标拖动图像?

java - 为什么我不能在 Java 中屏蔽长数据类型的 32 位

java - 列表的返回方法列表

java - Spring 3.1 : Getting the <mvc:resources To Work

java - 通过Maven生成url nocache参数字符串

java - 子类之间转换的设计模式fu

java - 如何在java中使用poi自动调整行高?