2 回答

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
每當(dāng)在使用類的實(shí)現(xiàn)的實(shí)例上調(diào)用時(shí),該類StringBuffer不會(huì)重寫hashCode()從類繼承的方法。ObjecthashCodeStringBufferObjecthashCode
這是因?yàn)樗且粋€(gè)可變對(duì)象,與創(chuàng)建后您可以輕松修改對(duì)象的狀態(tài)StringBuffer不同。這使得它不適合在任何基于“散列”的數(shù)據(jù)結(jié)構(gòu)(例如 a)中使用,因?yàn)樗鼤?huì)不一致。StringStringBufferHashMap
hashCode類的方法是Object本地方法,通常通過將對(duì)象的內(nèi)部地址轉(zhuǎn)換為整數(shù)作為哈希碼值來實(shí)現(xiàn),也可能不是,因?yàn)檫@取決于 JVM 的內(nèi)部實(shí)現(xiàn),但在不可變類String中hashCode,使用對(duì)象的內(nèi)容進(jìn)行覆蓋和實(shí)現(xiàn),String以使其在哈希數(shù)據(jù)結(jié)構(gòu)中使用一致。
就像簡單的實(shí)驗(yàn)一樣,您可以運(yùn)行代碼片段來檢查這個(gè)理論:
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。這是因?yàn)閷?shí)例String實(shí)際上是使用對(duì)象的狀態(tài)來計(jì)算哈希碼,因此 和 是相同s1.toString()的s2.toString()。

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
StringBuffer
直接擴(kuò)展Object
類,并且不會(huì)覆蓋hashCode
類Object
。所以 的實(shí)現(xiàn)StringBuffer::hashCode
與 的實(shí)現(xiàn)相同Object::hashCode
。
添加回答
舉報(bào)