2012-11-15 92 views
0

我正在寫一個使用哈希映射的java程序。我知道一個hashmap是如何工作的。如果我是add(key,object),那麼java將找到密鑰的哈希碼並使用它來查找存儲object的存儲桶。
現在我有我自己的hashcode執行object。我想把這個作爲關鍵 - 就像add(object.hashcode(),object)
是否有可能阻止java再次哈希object.hashcode()?因爲我已經執行hashcode(),所以調用hashcode()上的hashcode會浪費時間。使用我自己的哈希碼哈希映射java

+1

我認爲有一個很好的理由,你爲什麼不只是想重寫相關對象的'hashCode'方法? – Perception

+0

@Perception:但hashmap會考慮密鑰的哈希碼,對吧? – Ashwin

+1

嗯,是的,但假設在將對象添加到地圖後沒有更改對象的任何'關鍵'屬性,只需調用'map.put(object,object)'。 – Perception

回答

5

執行此操作的方法是實施hashCode()以在計算散列值後對其進行高速緩存。請注意,這意味着您的對象是不可變的,或者至少在將對象放入地圖後,對hashCodeequals作出貢獻的字段不會更改。

您不需要使用散列碼作爲密鑰。此外,這幾乎肯定會是錯誤的做法,因爲它實際上是而不是哈希表應該如何工作。哈希碰撞是遊戲的名稱,因此哈希碼僅用於對一個存儲桶進行尋址,但(名稱全稱)一個存儲桶不包含一個,但包含任意多個對象。這些必須通過equals進行檢查以找到您正在尋找的確切人。

鑑於你最初的想法是使用hashcode作爲關鍵,它看起來像你不是真的在地圖之後,但在HashSet之後。您只是將對象添加到集合中,稍後會想要檢查對象的存在。這是一套。

+0

我不明白。 – Ashwin

+1

「我不明白」不是有用的評論。 –

+0

好的。如果我使用我自己的哈希代碼實現,並且如果發生衝突,那麼該存儲桶中的對象將被放入鏈接列表中。我也可以爲「對象」提供等式的實現。 – Ashwin

1

除非你有自己的實現,否則你不能這樣做。原因是當你使用get方法時,哈希被用來選擇你的對象。

+0

「原因是當你使用get方法時,哈希被用來選擇你的對象」 - 是的,我正在提供自己的哈希。 – Ashwin

+0

你正在做像map.put(object.hashCode(),...)。對嗎?當這樣做時,地圖將獲取作爲密鑰傳遞的對象的hashCode(這裏的關鍵是你的hashCode)。 – muruga