我的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/