[url=http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.28]Java语言规范15.28[/url]规定了Java的常量表达式可以表示原始类型或者字符串;它们不但可以由纯粹的字面量构成,还可以包含能在编译时确定结果的运算,包括+、-、~、!、*、/、%、<<、>>、>>>、<、>、<=、>=、==、!=、&、|、^、&&、||、? :,还有指向上述类型的常量(final变量)的表达式。
所以下面的abc不会在运行时创建多个String,而是编译时就已经合并为一个String了。
编译的.class文件:
而下面代码的比较也会相等:
即便混搭了字符串与数字的运算也没关系。
所以下面的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.Object
SourceFile: "JavaConstantExpression.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #4.#13; // java/lang/Object."<init>":()V
const #2 = String #14; // the integer 9223372036854775807 is big
const #3 = class #15; // JavaConstantExpression
const #4 = class #16; // java/lang/Object
const #5 = Asciz <init>;
const #6 = Asciz ()V;
const #7 = Asciz Code;
const #8 = Asciz LineNumberTable;
const #9 = Asciz main;
const #10 = Asciz ([Ljava/lang/String;)V;
const #11 = Asciz SourceFile;
const #12 = Asciz JavaConstantExpression.java;
const #13 = NameAndType #5:#6;// "<init>":()V
const #14 = Asciz the integer 9223372036854775807 is big;
const #15 = Asciz JavaConstantExpression;
const #16 = Asciz java/lang/Object;
{
public JavaConstantExpression();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 1: 0
public static void main(java.lang.String[]);
Code:
Stack=1, Locals=4, Args_size=1
0: ldc #2; //String the integer 9223372036854775807 is big
2: astore_3
3: return
LineNumberTable:
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
}
}
即便混搭了字符串与数字的运算也没关系。