为什么这些字符串在java中不指向同一个对象



我知道,如果我有两个值相同的字符串变量,由于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(。

最新更新