[問題] HashCode 與 記憶體位置的關聯

作者: noapaov (單身漢)   2015-05-24 18:01:23
最近看了一下書籍, 不太清楚理解是否有錯, 想請教一下各位
Object 類別所提供的 hashCode() method, 主要是返回物件的記憶體位置
經過運算後的整數, 所以與記憶體有密切關係
所以每個物件的HashCode()理論上應該都不一樣, 但是有些子類別繼承後會
進行equals和HashCode的覆寫,例如String、Array等, 所以就有可能造成 :
如果兩個物件使用equals(Object) 測試結果為不相等,
則這兩個物件呼叫 hashCode 時,可以獲得不同的整數結果("可以相同,也可以不同")
所以總結是如果繼承Object類的子類別, 沒有對equals hashCode進行改寫,
那麼這些物件產生的HashCode應該都不一樣, 但如果重寫就有可能造成HashCode相等, 但不一定是參考相同的記憶體位置情況
不知道原理是否是這樣
作者: mars90226 (火星人)   2015-05-24 20:48:00
hashCode跟記憶體無關他就是拿來計算hash需要的key而已hash需要這個key來判斷兩個Object是否一樣
作者: swpoker (swpoker)   2015-05-24 21:11:00
這裡不是C++啊?!為什麼都記憶體位置東跟記億體使用西呢?????
作者: MonyemLi (life)   2015-05-24 21:43:00
hashmap key 會受hashcode影響,但hash並不是記憶體位置
作者: noapaov (單身漢)   2015-05-24 23:40:00
主要是看到document api寫到 Object.hashCode()的定義This is typically implemented by converting theinternal address of the object into an integer
作者: ctrlbreak   2015-05-25 02:38:00
這邊指的位址在Java應該是物件的reference value
作者: noapaov (單身漢)   2015-05-25 08:26:00
你說的參考值指的是參考位置嗎?抱歉沒說清楚, 我指的都是hashCode()回傳值
作者: Killercat (殺人貓™)   2015-05-25 16:21:00
HashCode不見得是記憶體位置有興趣可以看看String的HashCode怎麼實作的去找一下OpenJDK原始碼翻一下吧 很好找的String hashCode()可能你看了會噗疵笑出來
作者: tas72732002 (蔥頭)   2015-05-25 18:30:00
原PO是說Object類別的hashCode() 不是String覆寫後的hashCode()
作者: Killercat (殺人貓™)   2015-05-25 18:45:00
下面有提供比較全面的說法啦... XD
作者: ctrlbreak   2015-05-25 20:26:00
我參考值指的就是你下一篇說的物件序號默認的hashCode一般是以物件序號為基礎去算出來的
作者: realmeat (真肉)   2015-05-26 13:53:00
寫了java到現在, 我還沒考慮過'記憶體位置'這東西
作者: pttworld (批踢踢世界)   2015-05-26 15:37:00
理論上是毋須探究的。頂多具備GC的概念就夠了。

Links booklink

Contact Us: admin [ a t ] ucptt.com