我正在优化使用equalsIgnoreCase
的一段代码,并以百万计数处理记录。请允许任何人给我一些见解,equalsIgnoreCase
和regionMatches
中的一个在java中更快更有效。
答案 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。