将两个字符串与"=="进行比较:它何时起作用?

Ale*_*ood 9 java string equals object

假设你有三个字符串,

String s1 = "string one";
String s2 = new String("string one");
String s3 = "string one";
Run Code Online (Sandbox Code Playgroud)

我知道这是事实,s1 == s2false的,但我读的地方,s1 == s3true.它是否正确?为什么或者为什么不?

Bas*_*Roy 22

字符串文字自动实现.因此s1 == s3为真.字符串可以在字符串常量池中创建,也可以在堆空间中创建.如果您实际在堆中创建了一个字符串,则该字符串将位于字符串常量池中.

创建字符串文字(String s1 ="string one")时,将在字符串常量池中创建字符串.此外,字符串常量池不存储重复项.所以,当你说,

String s1 = "string one";
String s3 = "string one";
Run Code Online (Sandbox Code Playgroud)

s1和s3都将指向字符串常量池中字符串的同一实例.所以s1.equals(s3)将是真的.并且s1 == s3也是如此; 因为两个指针都是一样的.

但是,使用"new"构造函数实例化字符串时

String s2 = new String("string one");
Run Code Online (Sandbox Code Playgroud)

然后在堆空间中创建s2.堆空间是与字符串常量池不同的内存区域

所以当s1.equals(s2)为真时,s1 == s2为假; 因为他们将指向不同的记忆区域.

但是,您可以转换使用"new"构造函数创建的字符串,以通过调用intern()函数将其移动到字符串常量池.所以s2.intern()会在字符串常量池中返回一个字符串; 虽然s2最初是在堆中创建的.

  • -1表示误导,毫无意义的第一句话,没有提及字符串实习. (2认同)
  • @vivek_jonam:Java字符串是不可变的.当然,你可以将`s3`重新绑定到一个新字符串,但这不会影响字符串`s1`的绑定. (2认同)