2017-08-02 69 views
4

我讀到HashMap有一個支持數組,其中存儲條目(標記爲存儲區編號,初始大小爲16)。數組是有序的,我可以調用get(n)來獲取第n個元素的位置。那爲什麼HashMap是無序的並且沒有get(n)方法?HashMap有支持數組,然後爲什麼它是無序

+0

「並沒有get(n)的方法」究竟如何做你期望'得到(N) 「工作/回報?Bucket可以容納許多具有* similar * hash屬性的元素(這裏可以說key'hashcode%16的結果相同的鍵將會進入同一個bucket)。無論如何,地圖是有序的,但不是我們可以依賴的方式,因爲它可以基於元素的數量進行更改(以更好地平衡桶中的元素)。 – Pshemo

+0

就像註釋一樣,如果你想維護**插入順序**並且使用'HashSet',那麼你可能會發現類LinkedHashSet有用,它通過添加兩個指針** prev **和* * next到每個元素(一種稱爲*鏈接列表*的技術)。 – Zabuza

+0

對於'HashMap'也是一樣,它們是一個名爲'LinkedHashMap'的類,它也是這樣做的。 – Zabuza

回答

4

這取決於您對訂購意味着什麼的看法。

確實HashMaps s在內部使用數組或具有固定排序的其他集合。然而,訂單有沒有與插入順序或類似的東西。這些元素是,例如,訂購的,它們的散列值的大小遞增,並且它們與元素本身的一些實際排序無關。

所以HashMap小號確實有一些像get(n)方法,如果你認爲n作爲哈希值的關鍵元素的的。該方法被稱爲get(*key*),它首先計算給定鍵元素的散列值,然後通過使用get(*hash-value*)來查看內部結構上的值。

這裏是一個圖像的快速搜索產量,顯示的HashSet S中的結構:

HashSet structure

注意HashSet s爲還挺比HashMaps一樣,他們使用相同的技術和相同的圖像應用。但不是插入一個元素,而是插入一個由鍵標識的容器,並且還包含一個值。


就像一個小概述。散列函數是一個函數,它給定一個對象使用它的屬性計算出一個小值,即散列值。計算通常可以快速完成,因此哈希值給定位置處的內部數組上的查找也很快。

爲了您的具體問題,爲的HashMap你一般不感興趣,什麼元素專門躲在哈希值12等等,這就是爲什麼他們沒有包括這種方法的用戶。但是,如果您真的需要爲特殊應用程序這麼做,或者您總是可以嘗試使用Reflection來訪問您的HashMap的內部,或者您也可以在提供此類方法的類中編寫一個小包裝。

+0

哦,謝謝你提及,完全錯過了!然而,這項技術本身保持不變。 – Zabuza

+0

確實。我編輯了答案。否則會混淆OP。然而它們之間的唯一區別是'HashSet'只是存儲元素而'HashMap'存儲容器,並不是很大的區別。 – Zabuza

+0

完全沒有區別。 'HashSet '基本上只是一個'HashMap ' – Michael

2

A HashMap分爲單獨的桶。桶最初由一個數組支持,但是如果桶變得太大,那麼它們會轉換爲基於散列碼分類的樹結構。僅僅這個事實就破壞了它可以保留廣告訂單的任何保證。

如果您想了解更多關於它是如何實現的,你可以看看my answer這個問題:HashMap Java 8 implementation

相關問題