我正在探索我在 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 中)。
添加回答
举报
0/150
提交
取消