Java表达式的常量折叠

[url=http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.28]Java语言规范15.28[/url]规定了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.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
}
}

即便混搭了字符串与数字的运算也没关系。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值