What's the quickest way to compare strings in Java?

后端 未结 7 2058
情话喂你
情话喂你 2020-12-06 04:42

What\'s the quickest to compare two strings in Java?

Is there something faster than equals?

EDIT: I can not help much to clarify the problem.

I have

相关标签:
7条回答
  • 2020-12-06 04:49

    Compare Strings of same length faster using the hashcode:

    public static boolean equals(final String s1, final String s2) {
    return s1 != null && s2 != null && s1.hashCode() == s2.hashCode()
        && s1.equals(s2);
    }
    

    You can test it, my results are for 4000000 compare operations including identical, equal and different strings:

    String.equals(String):  177081939
    equals(String, String):  44153608
    

    Note: Calculating the hashCode of a new string object takes some computation time and afterwards the hashCode is stored in the object. So my suggested improvement will only be faster than the default compare if string objects are reused. In my application I am using String constants and store strings in collections. Multiple comparisons of strings using my method are actually faster for me, but it may not be in general.

    If the method is used with new strings all the time like compare("a", "b"), it won't be an improvement.

    So the fastest way of comparing strings depends on:

    • Whether your string objects are reused (like from a collection) or are always new (like from an input stream)
    • Whether your strings have different lengths
    • Whether your strings differ at the start or the end of the string
    • Your programming style, how much constants are used
    • Your use of String.intern()

    Ignoring those facts, the majority of all programs will be fine with String.equals().

    0 讨论(0)
  • 2020-12-06 04:56

    I don't expect that Sun Oracle hasn't already optimized the standard String#equals() to the max. So, I expect it to be already the quickest way. Peek a bit round in its source if you want to learn how they implemented it. Here's an extract:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
                int j = anotherString.offset;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                        return false;
                }
                return true;
            }
        }
        return false;
    }
    
    0 讨论(0)
  • 2020-12-06 04:58

    Simple answer

    String.equals(Object)

    I'm pretty sure (this answer has some references) and it's very likely that the JIT will have an intrinsic for String#equals, which means it would be able to replace the call with specially crafted machine code for the architecture your JVM is currently running on.

    0 讨论(0)
  • 2020-12-06 04:59

    It depends what you need. I think equals() is really optimized but perhaps you need something else faster than equals(). Take a look at this post.

    0 讨论(0)
  • 2020-12-06 05:03

    As always, you will need to benchmark for your application / environment. And unless you have already profiled and idetified this as a performance bottleneck, it's probably not going to matter ("premature optimization is the root of all evil").

    Having said that:

    a.equals(b) is really fast for Strings. It's probably one of the most tightly optimized pieces of code in the Java platform. I'd be very surprised if you can find any faster way of comparing two arbitrary strings.

    There are special cases where you can cheat and use (a==b) safely, e.g. if you know that both Strings are interned (and therefore value identity implies object identity). In that case it may be slightly faster than a.equals(b) - but again this depends on compiler/JVM implementation. And it's very easy to shoot yourself in the foot if you don't know what you are doing.....

    0 讨论(0)
  • 2020-12-06 05:05

    If you can show that it's a significant bottleneck, which would surprise me, you could try

    s1.hashCode() == s2.hashCode() && s1.equals(s2)
    

    It might be a bit faster. It mightn't.

    0 讨论(0)
提交回复
热议问题