Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的equalsIgnoreCase与RegionMatch。哪个是有效的?_Java_String_String Comparison - Fatal编程技术网

Java中的equalsIgnoreCase与RegionMatch。哪个是有效的?

Java中的equalsIgnoreCase与RegionMatch。哪个是有效的?,java,string,string-comparison,Java,String,String Comparison,我正在优化一段代码,它使用equalsIgnoreCase处理数百万条记录。请任何人告诉我equalsIgnoreCase和regionMatches中哪一个在java中更快更高效。equalsIgnoreCase使用regionMatches(至少在OpenJDK中): 所以我想如果一个应该更快,它应该是regionMatches,但它肯定可以忽略不计。如果你检查equalsIgnoreCase的实现,它只依赖于regionMatches: public boolean equalsIgnor

我正在优化一段代码,它使用
equalsIgnoreCase
处理数百万条记录。请任何人告诉我
equalsIgnoreCase
regionMatches
中哪一个在java中更快更高效。

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


所以我想如果一个应该更快,它应该是
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));
    }

}

所以就像前面提到的其他例子一样,equalsIgnoreCase只使用regionMatch。因此,我还建议您应该使用regionMatches。

您可以尝试使用JMH对这两种方法的性能进行基准测试。我建议使用真实的数据集进行测试。是的。。现在就做。。看到了源代码。。感谢您的建议:-)我必须补充一点,我的示例依赖于这样一个事实:您检查数百万个不相等的字符串,否则equalsIgnoreCase可能会更快。基准测试并不是那么容易,需要考虑很多参数(JVM预热、编译器优化等)。有关更多详细信息,请参阅。此外,您的基准测试给出如此不同结果的主要原因是您忘记使用
regionMatches
,而
ignoreCase
标志设置为
true
SOURCE.regionMatches(true,0,SEARCH,0,6)。是的,你是对的。但是,如果您也使用SOURCE.regionMatches(true,0,SEARCH,0,6)尝试该示例;那么结果也很清楚。。
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