Java String Buffer

时间:2013-07-09 16:31:45

标签: java

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");
    }

  }
}

5 个答案:

答案 0 :(得分:8)

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

buffer

此外,从Java 5开始,使用if (buffer.toString().equals(newString)) { //... } 代替StringBuilder会更好。有关更多信息:Difference between StringBuilder and StringBuffer

答案 1 :(得分:2)

当比较的两个对象相同类型时,

equals(返回false。无论包含的字符串如何,StringBuffer都是与String不同的类型,并且比较永远不会成立。

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

答案 2 :(得分:0)

您正在比较:

if (buffer.equals(newString)) 

实际上,它将StringBuffer对象类型与String对象类型进行比较。那显然会失败。

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

As per official doc

  

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

     

它是自反的:对于任何非空参考值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。

答案 3 :(得分:0)

equals() contract表示x.equals(y)当且仅当x.getClass() == y.getClass()时才返回true。换句话说,xy必须是同一个类的实例。在这种情况下,您要尝试将StringBufferString进行比较。对于行为良好的false方法,比较两个不同类的实例始终为equals()

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

buffer.toString().equals(newString)

答案 4 :(得分:0)

等于具有String对象的StringBuffer对象,请使用:

buffer.toString()。等于(newString)

并且更好地使用StringBuilder,因为StringBuffer不是TheredSafe