What is an efficient way to compare StringBuilder objects

后端 未结 4 1048
无人共我
无人共我 2021-01-03 19:25

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

相关标签:
4条回答
  • 2021-01-03 20:03

    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.

    0 讨论(0)
  • 2021-01-03 20:07

    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");
    }
    
    0 讨论(0)
  • 2021-01-03 20:11

    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;
    }
    
    0 讨论(0)
  • 2021-01-03 20:14

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

    System.out.println(sb1.compareTo(sb2) == 0);
    
    0 讨论(0)
提交回复
热议问题