What is an efficient way to compare StringBuilder objects

Since Java 11, StringBuilder implements Comparable, so you can use a compareTo method for the equality test:

System.out.println(sb1.compareTo(sb2) == 0);

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

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 StringBuilders!

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.


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

Tags:

Java