Java字符串拼接的运算结果是否属于编译时常量?
Java编译时常量折叠规则
你遗漏的是Java的**编译时常量折叠(Constant Folding)**相关的特性,具体规则如下:
- 当字符串拼接操作的所有操作数都是编译时常量时,编译器会在编译阶段直接完成拼接运算,生成的结果也会作为编译时常量处理,不需要到运行时再执行计算。
- 编译时常量的判定规则包括:
- 字面量(包括字符串字面量、基础类型字面量)本身属于编译时常量
- 用
final修饰的、在编译期就确定了取值的常量变量(constant variable)也属于编译时常量 - 多个编译时常量做简单运算(算术运算、字符串拼接等)的结果,同样会被判定为编译时常量
回到你给出的代码:String first = "rat" + 1;
其中"rat"是字符串字面量,1是int类型字面量,二者都属于编译时常量,编译器会在编译阶段直接把二者拼接成"rat1",等价于你直接写String first = "rat1";,所以结果自然会被存入字符串常量池。
注意:如果拼接的操作数里有非常量(比如普通变量、方法返回值等),就不会触发编译期折叠,才会在运行时生成新的字符串对象。比如以下代码就不会生成编译时常量:
String s = "rat"; String first = s + 1; // s是普通变量,不会触发折叠
内容的提问来源于stack exchange,提问作者Oğuzcan Budumlu
相关产品推荐
相关产品推荐

