2 回答

TA貢獻1725條經驗 獲得超8個贊
每當在使用類的實現的實例上調用時,該類StringBuffer不會重寫hashCode()從類繼承的方法。ObjecthashCodeStringBufferObjecthashCode
這是因為它是一個可變對象,與創建后您可以輕松修改對象的狀態StringBuffer不同。這使得它不適合在任何基于“散列”的數據結構(例如 a)中使用,因為它會不一致。StringStringBufferHashMap
hashCode類的方法是Object本地方法,通常通過將對象的內部地址轉換為整數作為哈希碼值來實現,也可能不是,因為這取決于 JVM 的內部實現,但在不可變類String中hashCode,使用對象的內容進行覆蓋和實現,String以使其在哈希數據結構中使用一致。
就像簡單的實驗一樣,您可以運行代碼片段來檢查這個理論:
StringBuffer s1 = new StringBuffer("foo");
StringBuffer s2 = new StringBuffer("foo");
System.out.println(s1.hashCode() == s2.hashCode());
System.out.println(s1.toString().hashCode() == s2.toString().hashCode());
這將輸出false和true。這是因為實例String實際上是使用對象的狀態來計算哈希碼,因此 和 是相同s1.toString()的s2.toString()。

TA貢獻1806條經驗 獲得超8個贊
StringBuffer
直接擴展Object
類,并且不會覆蓋hashCode
類Object
。所以 的實現StringBuffer::hashCode
與 的實現相同Object::hashCode
。
添加回答
舉報