String s="test";
StringBuilder sb = new StringBuilder("test");
System.out.println(s); //prints test
System.out.println(sb); //prints test
s.equals(sb); -> false
谁能解释为什么
答案 0 :(得分:2)
s
是String
,而sb
是StringBuffer
。它们不是同一对象,因此默认情况下,它们不能等效。
StringBuffer
doesn't override Object.equals
也无济于事,因此StringBuilder
对象将only ever be equivalent to its same instance。
答案 1 :(得分:1)
这是因为String
对象与StringBuilder
对象不同。
您可能想要的是:
s.equals(sb.toString())
以下是String
类的equals
方法的样子:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) { // this condition is false for StringBuilder objects
// some logic here
}
}
return false;
}
来自openjdk。
如您所见,由于以下情况,equals
方法将return false
:
if (anObject instanceof String)
答案 2 :(得分:1)
并说明为什么在后台打印它们都做同样的事情:在StringBuilder对象上调用System.out.println
时,它将自动在对象上调用toString
方法以实现以下目的:您。
因此,您可以像这样为它提供StringBuilder对象:System.out.println(sb);
,但它可以有效(自动)将其转换为System.out.println(sb.toString());
答案 3 :(得分:0)
s
是String
,而sb
是StringBuilder
,因此它们不相等。如果要检查其字符串表示形式(toString()
)是否相等,则必须直接执行以下操作:
System.out.println(s.equals(sb.toString());
答案 4 :(得分:0)
我想补充一点,StringBuilder
不会覆盖equals
和hashcode
方法。因此,equals
方法使用默认对象标识比较。因此,只有且StringBuilder
为真时,sb1
和sb2
这样的两个sb1==sb2
实例才相等。
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = sb1;
if(sb1.equals(sb2){
//they are equals
}
因此,当您执行equals
测试时,无法满足字符串sb.equals(s)
方法 SYMMETRIC 的约定。