Java表达式的常量折叠
Java语言规范15.28规定了Java的常量表达式可以表示原始类型或者字符串;它们不但可以由纯粹的字面量构成,还可以包含能在编译时确定结果的运算,包括+、-、~、!、*、/、%、<<、>>、>>>、<、>、<=、>=、==、!=、&、|、^、&&、||、? :,还有指向上述类型的常量(final变量)的表达式。所以下面的abc不会在运行时创建多个String,而是编译时就已经合并为一个String了。
public class JavaConstantExpression { public static void main(String[] args) { final long maxLong = Long.MAX_VALUE; // results in a single String constant String abc = "the integer " + (true ? maxLong : 0) + " is big"; }}
编译的.class文件:
Compiled from "JavaConstantExpression.java"public class JavaConstantExpression extends java.lang.ObjectSourceFile: "JavaConstantExpression.java"minor version: 0major version: 50Constant pool:const #1 = Method #4.#13; //java/lang/Object."<init>":()Vconst #2 = String #14; //the integer 9223372036854775807 is bigconst #3 = class #15; //JavaConstantExpressionconst #4 = class #16; //java/lang/Objectconst #5 = Asciz <init>;const #6 = Asciz ()V;const #7 = Asciz Code;const #8 = Asciz LineNumberTable;const #9 = Asciz main;const #10 = Asciz ();Code: Stack=1, Locals=4, Args_size=1 0: ldc #2; //String the integer 9223372036854775807 is big 2: astore_3 3: returnLineNumberTable: line 5: 0 line 6: 3}
而下面代码的比较也会相等:
public class StringConstant { public static void main(String[] args) { String a = "123" + "456"; String b = "12" + 3456; System.out.println(a == b); // true }}
即便混搭了字符串与数字的运算也没关系。
页:
[1]