簡體   English   中英

Java Hashmap 內部工作原理 123

[英]Java Hashmap Internal Workings 123

我想知道如何在哈希映射中檢索特定存儲桶的鏈接列表。

我們知道密鑰存儲在桶中,如果發生密鑰沖突,每個桶都有一個鏈表。 因此,如果哈希映射維護鏈表而不刪除或覆蓋值那么我們如何檢索該鏈表?

那么我們如何檢索那個鏈表呢?

恐怕你做不到。 並且出於多種原因。 例如:

  1. 這是一個隱藏的實現細節,因為它可能會更改,恕不另行通知。

  2. 在最近的實現中(Java 8 以后),它實際上不是一個鏈表……這強化了第一點的信息。 是的,他們確實改變了它。

  3. 如果您能夠直接訪問數據結構,由於通過HashMap API 中的正常操作對結構進行了意外更改,您的代碼可能會以“有趣的方式”中斷。`

  4. 您的代碼也可能以“有趣的方式”破壞數據結構。


現在,如果您有點瘋狂,您可以忽略上述基本原理並使用反射來打破抽象並訪問數據結構。 但是請不要在與我有任何關系的任何項目中嘗試這個!

實際上,您不能假設HashMap使用鏈表。 OpenJDK8 的 HashMap是鏈表和樹的混合體。

它是一個私有變量,因此需要使用反射並依賴內部細節。 但是一旦你走那條路,你就會創建對那個特定 JDK 版本的依賴。 例如,如果實現代碼遍歷JDK8 HashMap,它可能與JDK9樹等一起變得無用,更不用說其他JDK實現了。 編輯:看起來反射可能不適用於Java 9 。)

如果你想依賴某些特定的 HashMap 實現,你也應該自己實現它(或復制 OpenJDK 的一個)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM