30

好吧,我有两个 StringBuilder 对象,我需要在 Java 中比较它们。我知道我能做的一种方法是

sb1.toString().equals(sb2.toString());

但这意味着我正在创建两个 String 对象,有没有更好的方法来比较 StringBuilder 对象。可能是您不需要创建其他对象的地方?

4

4 回答 4

43

正如您显然已经知道的那样,StringBuilder继承equals()java.lang.Object,因此StringBuilder.equals()只有在将相同的对象作为参数传递时才返回 true。它不比较两个StringBuilders 的内容!

如果查看源代码,您会得出结论,最有效的比较(不涉及创建任何新对象)是比较.length()返回值,然后如果它们相同,则比较charAt(i)每个的返回值特点。

于 2012-06-13T02:20:18.943 回答
23

由于 Java 11StringBuilder实现Comparable了 ,因此您可以使用一种compareTo方法进行相等性测试:

System.out.println(sb1.compareTo(sb2) == 0);
于 2018-10-01T17:07:09.843 回答
3

两个 StringBuilder 对象永远不会相等。使用 .toString() 获取两个对象的字符串表示,然后使用 .equals() 比较对象。这样,String 类中的 equals() 方法就会被调用,该方法比较对象的字符串值,而不是比较内存位置。

StringBuilder a= new StringBuilder("HELLO JAVA");
StringBuilder b= new StringBuilder("HELLO JAVA");
if (a.toString().equals(b.toString())){
System.out.println("Objects are equal");
}
于 2014-08-13T19:58:14.977 回答
1

没有新分配的解决方案是首先比较长度,如果不同,然后逐个字符地比较。这比在 StringBuilder 调用上通过 toString() 执行比较更有效和更快,后者将分配一个新字符串。

下一个片段假定两个参数都不为空,也不是同一个对象实例:

public boolean compare(final StringBuilder left, final StringBuilder right) {
    final int length = left.length();

    if (length != right.length())
        return false;

    for (int index = 0; index < length; index++) {
        if (left.charAt(index) != right.charAt(index))
            return false;
    }

    return true;
}
于 2020-12-23T12:00:45.687 回答