我知道,如果我有两个值相同的字符串变量,由于java字符串池,它们指向同一个字符串对象。
这里有一个例子:
String test = "1234";
String test2 = "1234";
System.out.println(test == test2);
System.out.println("1234" == test2);
输出如下:
true
true
但如果我有下面的代码,它会打印出它们不是同一个对象
String test = "1234";
int i = 1234;
String s = "" + i;
System.out.println(test == s);
System.out.println("1234" == s);
输出:
false
false
有人能向我解释一下这种行为的原因吗?
"" + i;
不是常量表达式,因此它不是内部表达式。如果i
是最终的,或者它被直接写为"" + 1234
,那么该值将被中间化。
§3.10.5.字符串文字:
此外,字符串文字总是引用类string的同一实例。这是因为字符串文字——或者更一般地说,是常量表达式(§15.28(的值的字符串——是";被拘留";以便使用String.intern.方法共享唯一实例
§15.28.常量表达式:
常量表达式是表示基元类型的值或字符串的表达式,该值不会突然完成,并且仅使用以下内容组成:
- 基元类型的文字和字符串类型的文字(§3.10.1、§3.10.2、§3.10.3、§3.10.4、§3.10.5(
- 强制转换为基元类型并强制转换为String类型(§15.16(
- 一元运算符+、-、~和!(但不是++或--((§15.15.3、§15.15.4、§15.15.5、§15.15.6(
- 乘法运算符*、/和%(§15.17(
- 加法运算符+和-(§15.18(
- 轮班操作员>和>>(§15.19(
- 关系运算符和>=(但不是instanceof((§15.20(
- 相等运算符==和!=(§15.21(
- 位运算符和逻辑运算符&、^和|(§15.22(
- 条件和运算符&&和条件或运算符||(§15.23,§15.24(
- 三元条件运算符?:(§15.25(
- 带圆括号的表达式(§15.8.5(,其包含的表达式是常量表达式。
- 引用常量变量的简单名称(§6.5.6.1((§4.12.4(。
- TypeName形式的限定名称(§6.5.6.2(。引用常量变量的标识符(§4.12.4(。