Well I have two StringBuilder objects, I need to compare them in Java. One way I know I can do is
sb1.toString().equals(sb2.toString());
bu
As you apparently already know, StringBuilder
inherits equals()
from java.lang.Object
, and as such StringBuilder.equals()
returns true only when passed the same object as an argument. It does not compare the contents of two StringBuilder
s!
If you look at the source, you'll conclude that the most efficient comparison (that didn't involve creating any new objects) would be to compare .length()
return values, and then if they're the same, compare the return values of charAt(i)
for each character.
Two StringBuilder objects are never equal. Use .toString() to get the string representation for both the objects and then use .equals() to compare the objects. This way equals() method from the String class gets invoked that compares the string value of the objects instead of comparing the memory location.
StringBuilder a= new StringBuilder("HELLO JAVA");
StringBuilder b= new StringBuilder("HELLO JAVA");
if (a.toString().equals(b.toString())){
System.out.println("Objects are equal");
}
A solution without new allocations would be to compare first at length, and if it differs, then char by char. This is more efficient and faster than performing a compare via a toString() on the StringBuilder call, which would allocate a new string.
The next snipped assumes both parameters aren't null neither the same object instance:
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;
}
Since Java 11, StringBuilder
implements Comparable
, so you can use a compareTo
method for the equality test:
System.out.println(sb1.compareTo(sb2) == 0);