簡體   English   中英

Java如何在HashMap或HashTable中訂購商品?

[英]How does Java order items in a HashMap or a HashTable?

我想知道Java在添加時如何在MapHashMapHashtable )中命令項目。 鍵是由哈希碼,內存引用還是按分配優先級排序的?

這是因為我注意到Map中的相同對並不總是在同一個順序中

java.util.HashMap是無序的; 你不能也不應該假設任何事情。

這個類不保證地圖的順序; 特別是,它不保證訂單會隨着時間的推移保持不變。

java.util.LinkedHashMap使用insert-order。

此實現與HashMap不同之處在於它維護了一個貫穿其所有條目的雙向鏈表。 此鏈接列表定義迭代排序,通常是鍵插入映射的順序(插入順序)。

java.util.TreeMap是一個SortedMap ,它使用鍵的自然或自定義順序。

地圖根據其鍵的自然順序進行排序,或者根據使用的構造函數在地圖創建時提供的Comparator排序。

首先: HashMap特別提供穩定和/或定義的排序。 因此,您觀察到的任何內容都只是一個實現細節,您不能以任何方式依賴它。

因為知道看似隨機排序的原因有時很有用,所以這里是基本的想法:

HashMap具有多個存儲條目的存儲桶(實現為數組)。

將項添加到地圖時,會根據其hashCode的值和HashMap的存儲區大小將其分配給存儲桶。 (請注意,存儲桶可能已被占用,這稱為沖突。這是優雅且正確的處理,但我會忽略對描述的處理,因為它不會改變概念)。

該entires的感知排序(例如通過循環返回的Map )依賴於這些分組項的順序。

每當重新定義大小時(因為地圖超過其豐滿度閾值),則桶的數量改變,這意味着每個元素的位置可能改變,因為桶位置也是從桶的數量導出的。

HashMap根本不排序。 對於按鍵值排序的地圖,您應該使用TreeMap

TreeMap的JavaDocs:

基於Red-Black樹的SortedMap接口實現。 此類保證映射將按升序鍵順序排序,根據鍵類的自然順序(請參閱Comparable)進行排序,或者根據創建時提供的比較器進行排序,具體取決於使用的構造函數。

HashMap的文檔:

這個類不保證地圖的順序; 特別是,它不保證訂單會隨着時間的推移保持不變。

Map不是有序的數據結構 - 您不應該依賴HashMap中按特定順序的條目。 一些Map實現(如LinkedHashMapTreeMap確實保證了某個順序,但HashMap卻沒有。

如果你真的想知道內部發生了什么,查找HashMap的源代碼 - 你可以在src.zip中找到它,它應該在你的JDK安裝目錄中。

HashMap有許多“存儲桶”,用於存儲其條目。 存儲條目的桶由條目的密鑰的哈希碼確定。 您在HashMap查看條目的順序取決於鍵的哈希碼。 但是不要編寫依賴於HashMap某個順序的條目的程序 - 實現可能會在未來的Java版本中發生變化,然后您的程序將無法再運行。

hashmap具有未定義的元素順序

哈希表中沒有定義的排序。 根據哈希碼將密鑰放入一個槽中,但即使這樣也不是一個簡單的按順序排列的代碼。

HashMap使用使用密鑰的一部分生成的唯一哈希值來存儲值。 此哈希值映射到將要存儲的地址。 這就是它如何確保訪問O(1)。

另一方面,LinkedHashmap會保留您添加到地圖的順序。

暫無
暫無

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

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