1. 程式人生 > >HashMap,LinkedHashMap,TreeMap的有序性

HashMap,LinkedHashMap,TreeMap的有序性

HashMap 是將 Key 做 Hash 演算法,然後將 Hash 值對映到記憶體地址,直接取得 Key 所對應的資料。在 HashMap 中,底層資料結構使用的是陣列,所謂的記憶體地址即陣列的下標索引。HashMap 的高效能需要保證以下幾點:

  1. Hash 演算法必須是高效的;
  2. Hash 值到記憶體地址 (陣列索引) 的演算法是快速的;
  3. 根據記憶體地址 (陣列索引) 可以直接取得對應的值。

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