在 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 字节码优化有关,但不明白如何。
最佳答案
我认为这是死代码,是从 Strings 仍然共享支持数组并具有 offset
和 count
的时代遗留下来的,因此您需要调整索引 a一点点。
String 实现在 JDK 7 Update 6 中发生了变化(许多人对此感到不安,尤其是它发生在次要版本中)。字符串不再共享后备数组(除非字符串本身相等,在这种情况下,新的重复数据删除器会尝试重新共享它们)。
您可以在“how does String.equals() work”中看到对旧实现的讨论。
关于java - String.equals 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33567593/