Java等于或==

时间:2014-04-02 09:13:49

标签: java string comparison equals-operator

我知道在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中有什么变化吗?现在使用==?

时字符串使用标准的可比实现

5 个答案:

答案 0 :(得分:3)

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

因此,变量s1s2的值实际上是相同的。

答案 1 :(得分:2)

  

s1 == s2; // true,但不同的引用因此必须返回false

不,两者都在String文字池中引用相同的字符串文字对象"123"。因此,当您使用==

进行检查时返回true

如果使用String s = "Some"创建对象,则从String Constant Pool引用该对象。

如果使用new运算符创建对象,则将在堆中创建String对象。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

  

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