equalsIgnoreCase 与 Java 中的 regionMatches。哪个效率高?
equalsIgnoreCase vs regionMatches in Java . Which is efficient?
我正在优化一段使用 equalsIgnoreCase
的代码,它处理数以百万计的记录。请任何人给我一些见解 equalsIgnoreCase
和 regionMatches
中的哪一个在 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.
我正在优化一段使用 equalsIgnoreCase
的代码,它处理数以百万计的记录。请任何人给我一些见解 equalsIgnoreCase
和 regionMatches
中的哪一个在 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.