equalsIgnoreCase 与 Java 中的 regionMatches。哪个效率高?

equalsIgnoreCase vs regionMatches in Java . Which is efficient?

我正在优化一段使用 equalsIgnoreCase 的代码,它处理数以百万计的记录。请任何人给我一些见解 equalsIgnoreCaseregionMatches 中的哪一个在 java.

中更快更有效

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

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

所以我想如果一个应该更快,它应该是 regionMatches,但它肯定可以忽略不计。

如果你检查 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。即使您有数百万个字符串,差异也太小而无法注意到。

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.