-4

我知道在 String 类的情况下,您通常必须使用 .equals() 比较两个字符串,例如:

String s1 = "123";
String s2 = "123";
String s3 = "1234";
s1.equals(s2); // true
s1.equals(s3); // false

但是,我今天试过这段代码:

s1 == s2; // true, but different references so had to return false
s1 == s3; // false

那么,java中有什么改变吗?现在字符串在使用 == 时是否使用标准的可比较实现?

4

5 回答 5

3

该表达式"123"不是 String 实例创建表达式;它表示对单个 String 实例的引用,该实例表示字符串池中的字符串值。

因此,您的变量的值s1实际上s2是相同的。

于 2014-04-02T09:14:53.980 回答
2

s1 == s2; // true,但是不同的引用所以必须返回 false

不,两者都"123"在字符串文字池中引用相同的字符串文字对象。因此,当您检查时返回 true==

如果String s = "Some"用于创建对象,则该对象是从字符串常量池中引用的。

如果使用 new 操作符创建对象,那么会在堆中创建 String 对象。

于 2014-04-02T09:15:39.960 回答
1
String s1 = new String("123");
String s2 = new String("123");

s1.equals(s2); true,因为这种方法不是检查值而是检查对象,但s1==s2;在这种情况下是错误的。

于 2014-04-02T09:23:03.257 回答
1

==仅检查引用所引用的对象。

String s1 = "123";
String s2 = "123";

这里 s1 和 s2 指向同一个字符串池对象"123"

于 2014-04-02T09:17:51.767 回答
0

如果将文字分配给 String 变量,它将指向在字符串池中找到的内部化字符串。但是如果你通过 new String("123") 实例化一个字符串,你会得到一个新的。如果您想避免这种情况,仅使用字符串池中的单例,则必须调用 new String("123").intern(),它将新实例放入池中,或者如果池中已存在相等的字符串, 返回其引用。来自 JavaDoc:

当调用 intern 方法时,如果池中已经包含一个字符串,该字符串等于由 #equals(Object) 方法确定的此 String 对象,则返回池中的字符串。否则,将此String对象添加到池中并String返回对该对象的引用。

于 2014-04-02T09:20:06.513 回答