我有两个StringBuilder对象,我需要在Java中对它们进行比较。 我知道我能做的一种方式是
sb1.toString().equals(sb2.toString());
但这意味着我正在创建两个String对象,有没有更好的方法来比较StringBuilder对象。可能是你不需要创建其他对象的东西吗?
答案 0 :(得分:34)
正如您显然已经知道的那样,StringBuilder
从equals()
继承java.lang.Object
,因此StringBuilder.equals()
仅在与参数传递相同的对象时才返回true。它不比较两个StringBuilder
的内容!
如果查看源代码,您会得出结论:最有效的比较(不涉及创建任何新对象)将比较.length()
返回值,然后它们是否相同,比较每个字符的charAt(i)
的返回值。
答案 1 :(得分:6)
由于Java 11,StringBuilder
实现了Comparable
,因此您可以使用compareTo
方法进行相等性测试:
System.out.println(sb1.compareTo(sb2) == 0);
答案 2 :(得分: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");
}
答案 3 :(得分: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;
}
答案 4 :(得分:-3)
您可以使用String的contentEquals()
方法。
StringBuilder s = new StringBuilder("abc");
StringBuilder t = new StringBuilder("def");
if(s.contentEquals(new String(t)) {
System.out.println("Same");
}