比较字符串的不同方法

时间:2012-05-23 17:59:20

标签: java string

  

可能重复:
  Comparing two strings with “==”: when will it work?

我有以下代码:

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

3 个答案:

答案 0 :(得分:5)

比较String的正确方法是,

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

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

答案 1 :(得分:3)

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

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

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

要检查相等性,您必须使用equals函数:s1.equals(s2)

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

答案 2 :(得分:2)

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

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

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

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

然而,常量字符串有一种特殊情况。当你声明一个字符串时:

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

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