作者:
noapaov (單身漢)
2015-05-24 18:01:23最近看了一下書籍, 不太清楚理解是否有錯, 想請教一下各位
Object 類別所提供的 hashCode() method, 主要是返回物件的記憶體位置
經過運算後的整數, 所以與記憶體有密切關係
所以每個物件的HashCode()理論上應該都不一樣, 但是有些子類別繼承後會
進行equals和HashCode的覆寫,例如String、Array等, 所以就有可能造成 :
如果兩個物件使用equals(Object) 測試結果為不相等,
則這兩個物件呼叫 hashCode 時,可以獲得不同的整數結果("可以相同,也可以不同")
所以總結是如果繼承Object類的子類別, 沒有對equals hashCode進行改寫,
那麼這些物件產生的HashCode應該都不一樣, 但如果重寫就有可能造成HashCode相等, 但不一定是參考相同的記憶體位置情況
不知道原理是否是這樣
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()回傳值
HashCode不見得是記憶體位置有興趣可以看看String的HashCode怎麼實作的去找一下OpenJDK原始碼翻一下吧 很好找的String hashCode()可能你看了會噗疵笑出來
原PO是說Object類別的hashCode() 不是String覆寫後的hashCode()
作者: ctrlbreak 2015-05-25 20:26:00
我參考值指的就是你下一篇說的物件序號默認的hashCode一般是以物件序號為基礎去算出來的
寫了java到現在, 我還沒考慮過'記憶體位置'這東西
作者:
pttworld (批踢踢世界)
2015-05-26 15:37:00理論上是毋須探究的。頂多具備GC的概念就夠了。