【发布时间】:2016-02-07 15:32:12
【问题描述】:
在 JDK 8 中,String.equals 实现为
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
为什么迭代使用两个操作 - 递增 i 和递减 n 而不是类似的操作:
while (i < n) {
if (v1[i] != v2[i])
return false;
i++;
}
或
while (i-- != 0) {
if (v1[i] != v2[i])
return false;
}
进行一次递增或递减操作?
我想,它在某种程度上与 JVM 字节码优化有关,但不明白如何。
【问题讨论】:
-
@Thilo 你是对的。错过了这一点。
-
如果这是某种巧妙的优化(看不出如何),这是他们决定不用于
Arrays.equals的优化。Arrays.equals只是使用了明显的for循环。 -
事实上,
String.equals可以在这里调用Arrays.equals。可能出于性能原因没有完成(调用开销?)。