java中的不可变字符串

1 java string immutability

为什么这个打印真实:

String sOne = new String();
sOne = "one";
String sTwo = new String();
sTwo = "one";
System.out.println(sOne == sTwo ? "true": "false");
Run Code Online (Sandbox Code Playgroud)

但这打印错误:

String sOne = new String("one");
String sTwo = new String("one");
System.out.println(sOne == sTwo ? "true": "false");
Run Code Online (Sandbox Code Playgroud)

他们不应该打印假吗?...我明白字符串是不可变的,但我不明白为什么不用构造函数初始化导致不同的输出

cdh*_*wie 7

因为文字"one"在任何地方引用相同的String对象 ; 字符串文字总是被实习.第一个示例中的两个变量将引用同一个对象.

在第二种情况下,您强制在两个赋值中构造一个新的字符串对象,因此字符串相等但是不同的实例; 这两个变量引用等价但不同的对象.

表达式sOne.equals(sTwo)应该在两个示例中都返回true,因为它将对字符串内容执行相等测试.