2015-04-16 66 views
2

我熟悉HashMap的工作原理和鍵值概念。哈希的內部工作。放置並獲取方法實現

我知道HashCode方法根據傳遞的Object和key的地址生成散列碼。

但我想知道它是怎麼做的插入和在固定時間內搜索,即O(1)

我需要在細節時,我調用put()方法和get()方法到底發生了什麼就知道了。什麼是哈希碼值,這是給我在O(1)時間獲取價值的力量。

回答

1

可以在O(1)時間內計算出hashCode,並基於hashCode將您映射到數組的索引。該數組的每個索引都包含一個鏈接列表,其中的鍵映射到相同的索引(或存儲區)。該地圖以保持每個鏈表中元素的平均數量不變的方式進行維護,這意味着需要O(1)次根據其密鑰的hashCode來定位HashMap中的條目。

+0

「基於您映射到數組的索引的hashCode。」你是說,我們存儲哈希碼值和各自的索引映射,如果是的話,我們使用哪個集合?如果不是,那麼我們如何做映射。 – user1140840

+1

@ user1140840我不是說我們存儲和索引。 'hashCode'值可以通過鍵的類來緩存(例如,String類緩存String的hashCode,因爲String是不可變的,所以不需要多次計算)。每次調用get()或put()或containsKey()時,都會根據hashCode值計算索引。該映射是除了將結果應用模數之外還應用於hashCode值的函數,以便獲得數組範圍內的索引。 – Eran

+0

感謝您的回覆。我不同意你的「索引是計算」的術語。我假設數組的索引是預定義的,並且預定義的索引映射到唯一的「哈希碼」。另外,我不知道hashcode是如何被緩存或映射的。你可以分享一些鏈接或者用一些細節來解釋一些事情。謝謝! – user1140840