0

StringBuffer 如何在内部处理字符串?我尝试运行以下示例并得到“字符串不相等”的答案。

据我所知,如果两个字符串具有相同的值,则 equals() 返回 true。那么在这种情况下发生了什么?

class StringBufferTest {

public static void main(String[] args) {
    String newString = "HelloWorld";
    StringBuffer buffer = new StringBuffer(newString);

    if (buffer.equals(newString)) {
        System.out.println("Strings are equal");
    } else {
        System.out.println("String are unequal");
    }

  }
}
4

5 回答 5

8

您正在将 的实例StringBuffer与 的实例进行比较String,这不会为不同类型提供所需的结果。请注意,StringBuffer将使用纯文本,Object#equals因为它不会覆盖它(StringBufferJavaDocString#equals指出它确实会覆盖它)。您必须比较 的String内容,而buffer不是buffer变量的对象引用:

if (buffer.toString().equals(newString)) {
    //...
}

此外,从 Java 5 开始,最好使用StringBuilder而不是StringBuffer. 有关此的更多信息:StringBuilder 和 StringBuffer 之间的区别

于 2013-07-09T16:32:44.127 回答
2

equals(当被比较的两个对象不是同一类型时返回 false。无论包含的字符串如何,StringBuffer都是不同的类型,String并且比较永远不会为真。

buffer.toString.equals(newString)应该管用。

于 2013-07-09T16:33:15.057 回答
0

您正在比较:

if (buffer.equals(newString)) 

这实际上是将 StringBuffer 对象类型与 String 对象类型进行比较。这显然会返回错误。

为了获得从equals方法返回的真值,您需要比较相同类型的对象。

根据官方文档

public boolean equals(Object obj)
指示其他对象是否“等于”这个对象。
equals 方法在非空对象引用上实现等价关系:

它是自反的:对于任何非空引用值 x,x.equals(x) 应该返回 true。
它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应该返回 true。
它是可传递的:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true,则 x.equals(z) 应该返回 true。
它是一致的:对于任何非空引用值 x 和 y,x.equals(y) 的多次调用始终返回 true 或始终返回 false,前提是没有修改对象上 equals 比较中使用的信息。
对于任何非空引用值 x,x.equals(null) 应该返回 false。

于 2013-07-09T16:33:17.150 回答
0

不能将一个对象与一个对象相等,使用:StringStringBuffer

buffer.toString().equals(newString)

和更好的使用StringBuilder,因为StringBuffer不是TheredSafe

于 2013-07-09T16:49:59.677 回答
0

equals()契约意味着当x.equals(y)且仅当 时返回 true x.getClass() == y.getClass()。换句话说,xandy必须是同一个类的实例。在这种情况下,您试图将 aStringBuffer与 a进行比较String。比较两个不同类的实例将始终是false一种表现良好的equals()方法。

为了进行有意义的比较,您需要获取以下内容StringBuffer

buffer.toString().equals(newString)
于 2013-07-09T16:37:04.260 回答