2011-08-19 150 views
3

當Key-Value對被添加到Java中的HashMap中時,爲了確定值對象的存儲桶位置,哈希映射實現使用「key」對象的hashCode並對其應用散列。最後,鍵值對存儲在存儲桶中。關鍵對象被存儲,以便在發生碰撞時可以正確地檢索對象。在Java HashMap中存儲兩次「密鑰」?

我的問題是,「密鑰」對象在HashMap中存儲兩次,一次是密鑰,然後是密鑰對值存儲在鏈接列表中的存儲桶中?

+0

除了水桶,沒有其他地方可以存放。所以,密鑰只存儲一次,即存儲在桶中。 – ernesto

回答

2

首先:一個HashMap和(別的其實)永遠只能存儲參考一些對象,你進入它。因此,即使如果它是存儲兩個引用的密鑰,內存要求是最小的。

下一頁:實際實施HashMap不是由Java標準規定的,所以它可能(而且會)根據您使用的 JVM會有所不同。

最後,看着at the OpenJDK source code of HashMapEntry類只有一個引用(關鍵字key字段),所以密鑰只存儲一次。

+0

「取決於您使用的是哪個JVM」取決於Java運行時庫的哪個實現,而不是JVM本身。 – Raedwald

+1

@Raedwald:true,但通常* JVM綁定到運行時庫實現。 –

1

否。要選擇正確的存儲桶,將該密鑰進行散列處理,然後將其用作索引。沒有必要在這裏存儲任何東西。

0

不可以。如果您想確切知道HashMap的工作原理,那麼您可以查找源代碼。在JDK安裝目錄中應該有一個名爲src.zip的文件,其中包含標準庫中所有類和接口的Java源代碼。

1

我不確定,但似乎並不需要這樣做。在HashMap中訪問存儲桶時,散列函數將應用於正在搜索的密鑰。然後,它可以將該密鑰與存儲的密鑰進行比較。