ravenex 发表于 2013-2-7 17:26:52

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]
查看完整版本: Java表达式的常量折叠