HashMap,LinkedHashMap,TreeMap的有序性
HashMap 是將 Key 做 Hash 演算法,然後將 Hash 值對映到記憶體地址,直接取得 Key 所對應的資料。在 HashMap 中,底層資料結構使用的是陣列,所謂的記憶體地址即陣列的下標索引。HashMap 的高效能需要保證以下幾點:
- Hash 演算法必須是高效的;
- Hash 值到記憶體地址 (陣列索引) 的演算法是快速的;
- 根據記憶體地址 (陣列索引) 可以直接取得對應的值。
HashMap 實際上是一個連結串列的陣列。基於 HashMap 的連結串列方式實現機制,只要 HashCode() 和 Hash() 方法實現得足夠好,能夠儘可能地減少衝突的產生,那麼對 HashMap 的操作幾乎等價於對陣列的隨機訪問操作,具有很好的效能。但是,如果 HashCode() 或者 Hash() 方法實現較差,在大量衝突產生的情況下,HashMap 事實上就退化為幾個連結串列,對 HashMap 的操作等價於遍歷連結串列,此時效能很差。
HashMap 的一個功能缺點是它的無序性,被存入到 HashMap 中的元素,在遍歷 HashMap 時,其輸出是無序的。如果希望元素保持輸入的順序,可以使用 LinkedHashMap 替代。
LinkedHashMap 繼承自 HashMap,具有高效性,同時在 HashMap 的基礎上,又在內部增加了一個連結串列,用以存放元素的順序。
HashMap 通過 hash 演算法可以最快速地進行 Put() 和 Get() 操作。TreeMap 則提供了一種完全不同的 Map 實現。從功能上講,TreeMap 有著比 HashMap 更為強大的功能,它實現了 SortedMap 介面,這意味著它可以對元素進行排序。TreeMap 的效能略微低於 HashMap。如果在開發中需要對元素進行排序,那麼使用 HashMap 便無法實現這種功能,使用 TreeMap 的迭代輸出將會以元素順序進行。LinkedHashMap 是基於元素進入集合的順序或者被訪問的先後順序排序,TreeMap 則是基於元素的固有順序 (由 Comparator 或者 Comparable 確定)。
LinkedHashMap 是根據元素增加或者訪問的先後順序進行排序,而 TreeMap 則根據元素的 Key 進行排序。
測試程式碼:
public class test { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("HR", "1"); map.put("BT", "2"); map.put("RR", "4"); map.put("VF", "3"); System.out.print("HashMap:"); for(String key : map.keySet()) { System.out.print(map.get(key) + " "); } System.out.println(); Map<String, String> linkedMap = new LinkedHashMap<>(); linkedMap.put("BT", "2"); linkedMap.put("VF", "3"); linkedMap.put("HR", "1"); linkedMap.put("RR", "4"); System.out.print("LinkedHashMap:"); for(String key : linkedMap.keySet()) { System.out.print(linkedMap.get(key) + " "); } System.out.println(); Map<String, String> treeMap = new TreeMap<>(); treeMap.put("HR", "1"); treeMap.put("VF", "3"); treeMap.put("BT", "2"); treeMap.put("RR", "4"); treeMap.put("ZZ", "5"); System.out.print("TreeMap:"); for(String key : treeMap.keySet()) { System.out.print(treeMap.get(key) + " "); } System.out.println(); } }
結果輸出:
HashMap:4 3 2 1 LinkedHashMap:2 3 1 4 TreeMap:2 1 4 3 5