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行
StringBuilder
和StringBuffer
不会覆盖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()));