Java String.equals实现

Java String.equals实现,java,string,equals,Java,String,Equals,在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 (

在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++;
}
一次递增还是递减操作


我想,它在某种程度上与JVM字节码优化有关,但不了解如何进行。

我认为这是死代码,是从字符串仍然共享支持数组并且具有偏移量和计数的时代遗留下来的,因此需要稍微调整索引

字符串实现在JDK 7 Update 6中被更改(许多人对此感到不安,尤其是它发生在一个小版本中)。字符串不再共享备份阵列(除非字符串本身相等,在这种情况下,新的重复数据消除程序会尝试重新共享它们)


您可以在“.”上看到关于旧实现的讨论。

实际上,此java代码与实际的机器代码没有直接关系(至少对于现代桌面/服务器JVM是这样)。您可以阅读“HotSpot VM中的内在方法”。例如,

@你说得对。错过了这一点。如果这是某种聪明的优化(不知道如何),那么这就是他们决定不用于
数组的优化。等于
Arrays.equals
只对
循环使用明显的
。事实上,
String.equals
可以在这里调用
Arrays.equals。可能出于性能原因(调用开销?)没有这样做。另一个有趣的方面是equals没有使用字符串的哈希代码。这将在中讨论,现在数组不再共享,还可以比较两个数组的对象标识(
if(value==anotherString.value)返回true
)。我想这不会发生太多。当他们比较字符串的标识时,他们不是已经这样做了吗?@PaulBoddington:没有。
新字符串(“a”)!=新字符串(“a”)
(但它们可能具有相同的支持数组,即使在JDK8中也是如此)谢谢。我不知道,我以为所有的字符串现在都有自己的数组了。
while (i-- != 0) {
    if (v1[i] != v2[i])
        return false;
}