我正在探索我在 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
提交
取消