为什么 String.equals() 比它本身快?
我试图创建一个更快的String.equals()方法版本,并通过简单地复制它开始。我发现的结果非常令人困惑。当我运行复制粘贴的版本,计时并将其与JVM版本进行比较时,JVM版本更快。差异范围从6倍到34倍不等!简单地说,字符串越长,差异就越大。
boolean equals(final char a[], final char b[]) {
int n = a.length;
int i = 0;
while (n-- != 0) {
if (a[i] != b[i]) return false;
i++;
}
return true;
}
public static void main() throws Exception {
String a = "blah balh balh";
String b = "blah balh balb";
long me = 0, jvm = 0;
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
final char lhs[] = (char[]) value.get(a);
final char rhs[] = (char[]) value.get(b);
for (int i = 0; i < 100; i++) {
long t = System.nanoTime();
equals(lhs, rhs);
t = System.nanoTime() - t;
me += t;
}
for (int i = 0; i < 100; i++) {
long t = System.nanoTime();
a.equals(b);
t = System.nanoTime() - t;
jvm += t;
}
System.out.println("me = " + me);
System.out.println("jvm = " + jvm);
}
输出:
me = 258931
jvm = 14991
我编写的 equals() 方法是 String.equals() 方法中的副本粘贴版本。为什么 JVM 版本比复制粘贴版本快?它实际上不是一样的吗?
有人能解释一下为什么我看到如此明显的差异吗?
PS:如果你希望看到很大的差异,你可以创建长(真的,真的很长)字符串,最后只有一个字符不同。