为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

神不在的星期二 2023-06-08 19:15:48
我正在探索我在 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;}
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

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

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

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

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


查看完整回答
反对 回复 2023-06-08
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信