简体   繁体   中英

What is an efficient way to compare StringBuilder objects

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());

but that means I am creating two String objects, is there any better way to compare StringBuilder objects. Probably something where you do not need to create additional objects?

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.

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

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

You can use the contentEquals() method of the String.

StringBuilder s = new StringBuilder("abc");
StringBuilder t = new StringBuilder("def");

if(s.contentEquals(new String(t)) {
    System.out.println("Same");
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM