可以在toString实现中使用“ str” .equals(obj)吗?

时间:2018-09-20 05:45:38

标签: java

String s="test";
StringBuilder sb = new StringBuilder("test");

System.out.println(s); //prints test
System.out.println(sb); //prints test

s.equals(sb); -> false

谁能解释为什么

5 个答案:

答案 0 :(得分:2)

sString,而sbStringBuffer。它们不是同一对象,因此默认情况下,它们不能等效。

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)

sString,而sbStringBuilder,因此它们不相等。如果要检查其字符串表示形式(toString())是否相等,则必须直接执行以下操作:

System.out.println(s.equals(sb.toString());

答案 4 :(得分:0)

我想补充一点,StringBuilder不会覆盖equalshashcode方法。因此,equals方法使用默认对象标识比较。因此,只有且StringBuilder为真时,sb1sb2这样的两个sb1==sb2实例才相等。

StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = sb1;

if(sb1.equals(sb2){
  //they are equals
}

因此,当您执行equals测试时,无法满足字符串sb.equals(s)方法 SYMMETRIC 的约定。