typecast "(String)anObject" 和 anotherString.value.

我正在探索我在 equals 方法中遇到的 Java 中的 String API


首先,


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


我尝试了多种来源JLS,例如Herbert SchildtBook,但无法真正破译它。请帮助我更好地理解这一点。


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;

}


神不在的星期二
浏览 116回答 1
1回答

森栏

即使在检查了一个对象的 instanceOf String 之后,它已经在该条件下进行了类型转换,您能否帮助我理解这一点。无论检查如何instanceof,您都不能将 type 的值分配Object给 type 的变量String。所以anObject必须进行类型转换以确保编译器没问题。(至少有一种语言——TypeScript——其编译器能够根据检查推断出赋值是正确的instanceof,但 Java 的编译器还没有这样做……还没有。)这里为什么我们使用 anotherString.value.length 而不是 anotherString.lengthvalue是包含实际字符串数据的对象中的实例成员String(作为char[]或byte[]数组;它char[]在 JDK 1-8 中,它byte[]在 JDK 9+ 中)。使用它是有意义的,value.length因为这是数组的长度;如果value两个字符串的 s 长度不同,则它们不能相等。使用anotherString.length()将需要一个无意义的方法调用(记住,publiclength是一个方法,而不是一个字段),无论如何它最终都会查看value.length(加上一些开销,至少在 JDK11 中)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java