[英]How does Java order items in a HashMap or a HashTable?
我想知道Java在添加時如何在Map
( HashMap
或Hashtable
)中命令項目。 鍵是由哈希碼,內存引用還是按分配優先級排序的?
這是因為我注意到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
實現(如LinkedHashMap
和TreeMap
確實保證了某個順序,但HashMap
卻沒有。
如果你真的想知道內部發生了什么,查找HashMap
的源代碼 - 你可以在src.zip中找到它,它應該在你的JDK安裝目錄中。
HashMap
有許多“存儲桶”,用於存儲其條目。 存儲條目的桶由條目的密鑰的哈希碼確定。 您在HashMap
查看條目的順序取決於鍵的哈希碼。 但是不要編寫依賴於HashMap
某個順序的條目的程序 - 實現可能會在未來的Java版本中發生變化,然后您的程序將無法再運行。
hashmap具有未定義的元素順序
哈希表中沒有定義的排序。 根據哈希碼將密鑰放入一個槽中,但即使這樣也不是一個簡單的按順序排列的代碼。
HashMap使用使用密鑰的一部分生成的唯一哈希值來存儲值。 此哈希值映射到將要存儲的地址。 這就是它如何確保訪問O(1)。
另一方面,LinkedHashmap會保留您添加到地圖的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.