好吧,我有两个 StringBuilder 对象,我需要在 Java 中比较它们。我知道我能做的一种方法是
sb1.toString().equals(sb2.toString());
但这意味着我正在创建两个 String 对象,有没有更好的方法来比较 StringBuilder 对象。可能是您不需要创建其他对象的地方?
好吧,我有两个 StringBuilder 对象,我需要在 Java 中比较它们。我知道我能做的一种方法是
sb1.toString().equals(sb2.toString());
但这意味着我正在创建两个 String 对象,有没有更好的方法来比较 StringBuilder 对象。可能是您不需要创建其他对象的地方?
正如您显然已经知道的那样,StringBuilder
继承equals()
自java.lang.Object
,因此StringBuilder.equals()
只有在将相同的对象作为参数传递时才返回 true。它不比较两个StringBuilder
s 的内容!
如果查看源代码,您会得出结论,最有效的比较(不涉及创建任何新对象)是比较.length()
返回值,然后如果它们相同,则比较charAt(i)
每个的返回值特点。
由于 Java 11StringBuilder
实现Comparable
了 ,因此您可以使用一种compareTo
方法进行相等性测试:
System.out.println(sb1.compareTo(sb2) == 0);
两个 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");
}
没有新分配的解决方案是首先比较长度,如果不同,然后逐个字符地比较。这比在 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;
}