关于typecast "(String)anObject" 和 anotherString.value.length 的疑问

Doubts about typecast "(String)anObject" and anotherString.value.length

我正在探索 Java 中的字符串 API 我在 equals 方法中遇到

首先,

if (anObject instanceof String) {
    String anotherString = (String)anObject;

即使在检查了对象的 instanceOf String 之后,它已在该条件下进行了类型转换,您能否帮助我理解这一点。

其次,

String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length)

为什么我们使用 anotherString.value.length 而不是 anotherString.length

我尝试了 多个来源,例如 JLSHerbert Schildt 书籍,但无法真正破译它。请帮助我更好地理解这一点。

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;
}

even after checking instanceOf String for an object it has been typecasted inside that condition, could you kindly help me understand this.

无论 instanceof 检查如何,您都不能将 Object 类型的值赋给 String 类型的变量。所以 anObject 必须进行类型转换以确保编译器没问题。 (至少有一种语言——TypeScript——其编译器能够根据 instanceof 检查推断出赋值是正确的,但 Java 的编译器不会那样做......yet.)

Here why are we using anotherString.value.length not anotherString.length

value 是包含实际字符串数据的 String 对象中的实例成员(作为 char[]byte[] 数组;它是 char[]在 JDK 1-8 中,它是 byte[] 在 JDK 9+ 中)。使用 value.length 是有意义的,因为那是数组的长度;如果两个字符串的 value 长度不同,则它们不能相等。使用 anotherString.length() 将需要一个无意义的方法调用(请记住,public length 是一个 方法 ,而不是一个字段),这将结束无论如何都要看 value.length(加上一些开销,至少在 JDK11)。