Java中的equalsIgnoreCase与regionMatches。哪个有效?

时间:2015-05-21 13:09:34

标签: java string string-comparison

我正在优化使用equalsIgnoreCase的一段代码,并以百万计数处理记录。请允许任何人给我一些见解,equalsIgnoreCaseregionMatches中的一个在java中更快更有效。

3 个答案:

答案 0 :(得分:3)

如果您检查equalsIgnoreCase的实施情况,它只依赖于regionMatches

public boolean equalsIgnoreCase(String anotherString) {
    return (this == anotherString) ? true
            : (anotherString != null)
            && (anotherString.value.length == value.length)
            && regionMatches(true, 0, anotherString, 0, value.length);
}

因此,如果您不需要检查两个字符串的长度,您当然知道它们不引用相同的内存地址,并且第二个字符串永远不会为空,regionMatches将因为你避免数百万次检查,所以表现稍好一些。但是,实际上,你总是需要检查这个,所以只需坚持equalsIgnoreCase。即使你有数百万字符串,差异也太小而无法注意到它。

答案 1 :(得分:1)

equalsIgnoreCase使用regionMatches(至少在OpenJDK中):

public boolean equalsIgnoreCase(String anotherString) {
    return (this == anotherString) ? true :
           (anotherString != null) && (anotherString.count == count) &&
       regionMatches(true, 0, anotherString, 0, count);
}

所以我想如果一个人应该更快,它应该是regionMatches,但它肯定是微不足道的。

答案 2 :(得分:-2)

public class EqualsVsMatch {

    private static final int ROUNDS = 100000000;
    private static final String SEARCH = "SEARCH";
    private static final String SOURCE = "SOURCE";

    public static void main(String[] args) {

        long startRegionMatches = System.currentTimeMillis();
        for(int i = 0; i < ROUNDS; i++) {
            SOURCE.regionMatches(0, SEARCH, 0, 6);
        }
        long endRegionMatches = System.currentTimeMillis();

        long startEqualsIgnoreCase = System.currentTimeMillis();
        for(int i = 0; i < ROUNDS; i++) {
            SOURCE.equalsIgnoreCase(SEARCH);
        }
        long endEqualsIgnoreCase = System.currentTimeMillis();


        System.out.println("regionMatches: " + (endRegionMatches - startRegionMatches));
        System.out.println("equalsIgnoreCase: " + (endEqualsIgnoreCase - startEqualsIgnoreCase));
    }

}

我试过测试它,我得到了一些非常明确的结果:

regionMatches: 5
equalsIgnoreCase: 1021

与其他提到的一样,equalsIgnoreCase只使用regionMatches。所以我也建议你应该使用regionMatches。