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 (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 仍然共享支持数组并具有 offsetcount 的时代遗留下来的,因此您需要调整索引 a一点点。

String 实现在 JDK 7 Update 6 中发生了变化(许多人对此感到不安,尤其是它发生在次要版本中)。字符串不再共享后备数组(除非字符串本身相等,在这种情况下,新的重复数据删除器会尝试重新共享它们)。

您可以在“how does String.equals() work”中看到对旧实现的讨论。

关于java - String.equals 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33567593/

相关文章:

java - 找不到类 'EndpointsAsyncTask$1' ,从方法 EndpointsAsyncTask.xxx 引用 - 匿名函数

具有 png 背景的 java 面板

java - 签名变更

java - JPA的BaseEntity中如何实现equals()和hashcode()方法?

java - 列表列表上的等于方法

java - RSS 阅读器 NullPointerException

c - 逻辑上存储的字符指向字符串在哪里?

c# - 如何使用正则表达式强制执行单行?

java - 将 HashSet 与用户类 Employee 一起使用

java - Jetty 监控 WAR 文件并在其更改时进行更新