StringBuilder .equals Java

class strb { static public void main(String...string) { StringBuilder s1 = new StringBuilder("Test"); StringBuilder s2 = new StringBuilder("Test"); System.out.println(s1); System.out.println(s2); System.out.println(s1==s2); System.out.println(s1.equals(s2)); //Line 1 System.out.println(s1.toString()==s2.toString()); //Line 2 if(s1.toString()==s2.toString())System.out.println("True"); //Line 3 } } 

输出是

 Test Test false false 

只需对.equals快速提问。

无论对象内容如何,​​只有当两个对象引用指向同一个对象时,.equals才会返回true吗?

==========

编辑:现在我理解.equals的部分,但为什么第2行和第3行也没有返回true?

编辑:我相信==查看引用变量的地址,所以s1和s2不能相等。如果我的假设不对,请更正我

是的, StringBuilder does not override Object's .equals() function ,这意味着两个对象引用不相同,结果为false。

对于StringBuilder ,您可以使用s1.toString().equals(s2.toString())

对于编辑,您在两个不同的String对象上调用==运算符。 ==运算符将返回false,因为对象不同。 要比较字符串,您需要使用String.equals()String.equalsIgnoreCase()

这是你之前遇到的同样问题

正如您所提到的,Object类的.equals的默认实现。

其他类可以覆盖此行为。 StringBuilder不是其中之一。

String是其中之一,它会覆盖它以确保两个对象的String表示形成相同的字符序列。 字符串API

请参阅相关特定对象的文档。

StringBuilder类不提供重写的equals()方法。 因此,当在StringBuilder的实例上调用该方法时,将执行该方法的Object类实现,因为StringBuilder extends Object

它的源代码是

 public boolean equals(Object obj) { return (this == obj); } 

这简单地比较了参考平等。

为你的第一个答案检查@abmitchell的答案

对于你的编辑:

在Java Sting是一个对象,我们无法通过在java中使用==来比较对象!

==用于比较原语而不是对象!

为了compare Objects我们在java中使用equals()

StringBuilder类没有像String类中那样的equals()函数的实现。

因此它执行默认的Object类function,它再次仅检查地址等效性,在这种情况下不相同。 所以它打印错误。

注1 :您也可以在对象上使用==运算符,但它只是检查两个对象的地址是否相同。

注2 :==运算符在比较在字符串常量池中创建的两个String对象时起到了很好的作用,以确定它是否真的在字符串常量池中创建了一个新对象。

检查equals方法的合同:

它必须是一致的(如果对象没有被修改,那么它必须保持返回相同的值)。

这就是为什么StringBuilder不会覆盖它,无论其内容如何。

我们举个例子。

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

也许,对你来说,由于当前的运行时值,s1.equals(s2)会返回true。

但是如果你改变添加线怎么样:

  s1.append("abc"); 

然后s1和s2将具有不同的字符串内容,并且s1.equals(s2)预期为假。 但这与一致性相矛盾。

同意上述两个回复,但我真的想要比较你可以做的内容:

的System.out.println(s1.toString()等于(s2.toString())。); //第1行

StringBuilderStringBuffer不会覆盖Object类的equals函数。但是字符串会覆盖equals函数。 Object的function就是这个

 public boolean equals(Object obj) { return (this == obj); } 

你可以写这样的代码。

 System.out.println(s1.toString() == s2.toString()); System.out.println(s1.toString().equals(s2.toString()));