當Key-Value對被添加到Java中的HashMap中時,爲了確定值對象的存儲桶位置,哈希映射實現使用「key」對象的hashCode並對其應用散列。最後,鍵值對存儲在存儲桶中。關鍵對象被存儲,以便在發生碰撞時可以正確地檢索對象。在Java HashMap中存儲兩次「密鑰」?
我的問題是,「密鑰」對象在HashMap中存儲兩次,一次是密鑰,然後是密鑰對值存儲在鏈接列表中的存儲桶中?
當Key-Value對被添加到Java中的HashMap中時,爲了確定值對象的存儲桶位置,哈希映射實現使用「key」對象的hashCode並對其應用散列。最後,鍵值對存儲在存儲桶中。關鍵對象被存儲,以便在發生碰撞時可以正確地檢索對象。在Java HashMap中存儲兩次「密鑰」?
我的問題是,「密鑰」對象在HashMap中存儲兩次,一次是密鑰,然後是密鑰對值存儲在鏈接列表中的存儲桶中?
號
首先:一個HashMap
和(別的其實)永遠只能存儲參考一些對象,你進入它。因此,即使如果它是存儲兩個引用的密鑰,內存要求是最小的。
下一頁:實際實施HashMap
不是由Java標準規定的,所以它可能(而且會)根據您使用的 JVM會有所不同。
最後,看着at the OpenJDK source code of HashMap
,Entry
類只有一個引用(關鍵字key
字段),所以密鑰只存儲一次。
「取決於您使用的是哪個JVM」取決於Java運行時庫的哪個實現,而不是JVM本身。 – Raedwald
@Raedwald:true,但通常* JVM綁定到運行時庫實現。 –
否。要選擇正確的存儲桶,將該密鑰進行散列處理,然後將其用作索引。沒有必要在這裏存儲任何東西。
不可以。如果您想確切知道HashMap
的工作原理,那麼您可以查找源代碼。在JDK安裝目錄中應該有一個名爲src.zip
的文件,其中包含標準庫中所有類和接口的Java源代碼。
我不確定,但似乎並不需要這樣做。在HashMap中訪問存儲桶時,散列函數將應用於正在搜索的密鑰。然後,它可以將該密鑰與存儲的密鑰進行比較。
除了水桶,沒有其他地方可以存放。所以,密鑰只存儲一次,即存儲在桶中。 – ernesto