1

可能重复:
用“==”比较两个字符串:什么时候可以工作?

我有以下代码:

String s1 = new String("Test");
String s2 = new String("Test");

String s3 = "Test";
String s4 = "Test";

System.out.println(s1 == s2);
System.out.println(s3 == s4);

我得到以下输出:

false
true

为什么要打印第二个比较true

4

3 回答 3

5

比较 a 的正确方法String

 s1.equals(s2)
  1. System.out.println(s1==s2)prints false,因为s1s2指向堆上的不同对象。

  2. System.out.println(s3==s4)prints true, 因为s3s4是指向堆上同一个对象的对象引用。

于 2012-05-23T18:05:24.333 回答
3

不确定它是否回答了问题,但是:

==用于比较引用(指针)

所以s1==s2不要检查字符串是否相同,但 s1 和 s2 是否是同一个String实例。

要检查相等性,您必须使用以下equals功能:s1.equals(s2)

由于字符串被内部化,行为取决于 jvm 并且无法预测(即使大多数实现都是相同的)

于 2012-05-23T18:13:22.737 回答
2

在Java中,重要的是要注意,==总是意味着“如果这两个东西引用内存中对象的同一个实例,则返回true”

当您使用构造函数声明字符串时:

String s1 = new String("Foo");
String s2 = new String("Foo");

总是会创建一个新的字符串实例。这意味着即使它们具有相同的值,s1并且s2永远不会是相同的对象,因此==返回 false。

但是,常量字符串有一种特殊情况。当你这样声明一个字符串时:

String s3 = "Foo";
String s4 = "Foo";

然后在字符串池中创建单个常量字符串,变量 s3 和 s4 都指向它作为内存优化。然而,这应该被视为一个实现细节。仍应始终使用 Equals 方法进行比较。

于 2012-05-23T18:18:38.477 回答