簡體   English   中英

為什么LinkedHashMap無法對HashMap進行排序,而TreeMap卻可以呢?

[英]Why LinkedHashMap can't sort HashMap while TreeMap can?

我正在嘗試使用LinkedHashMapTreeMapHashMap的輸出進行排序。

當我使用TreeMap整理HashMap它就像一種魅力。

        Map<Integer, String> hMap = new HashMap<Integer, String>();

        hMap.put(40, "d");
        hMap.put(10, "a");
        hMap.put(30, "c");
        hMap.put(20, "b");

        System.out.println(" ");
        System.out.println("before");

        for (Map.Entry m1 : hMap.entrySet()) {
            System.out.print(m1.getKey() + " " + m1.getValue() + "    ");
        }

        System.out.println("after");

        Map<Integer, String> hTree = new TreeMap<Integer, String>(hMap);
        for (Map.Entry m2 : hTree.entrySet()) {
            System.out.print(m2.getKey() + " " + m2.getValue() + "    ");
        }

輸出:
before 20 b 40 d 10 a 30 c
after 10 a 20 b 30 c 40 d

但是,當我嘗試使用LinkedHashMapHashMap進行排序時,它似乎不起作用。

        Map<Integer, String> hMap = new HashMap<Integer, String>();

        hMap.put(10, "a");
        hMap.put(20, "b");
        hMap.put(30, "c");
        hMap.put(40, "d");

        System.out.println("before");

        for (Map.Entry m1 : hMap.entrySet()) {
            System.out.print(m1.getKey() + " " + m1.getValue() + "    ");
        }
        System.out.println(" ");
        System.out.println("after");

        LinkedHashMap<Integer, String> lhMap = new LinkedHashMap<Integer, String>(hMap);

        Iterator it = lhMap.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry me = (Map.Entry) it.next();
            System.out.print(me.getKey() + " " + me.getValue()+"   ");
        }

輸出:

before
20 b    40 d    10 a    30 c     
after
20 b   40 d   10 a   30 c  

誰能告訴我為什么這種分類不起作用? 是因為LinkedHashMap正在過濾HashMap嗎?
如果這就是為什么TreeMap該問題?
謝謝

LinkedHashMap維護插入順序。 這意味着,如果將經過排序的Map傳遞給構造函數,或者將密鑰按排序順序放入LinkedHashMap中,它將保持排序狀態。

但是,您將HashMap傳遞給LinkedHashMap構造函數,並且不對其進行排序(因為HashMap沒有排序)。 因此,生成的LinkedHashMap也未排序。

另一方面, TreeMap保持鍵的排序,因此將鍵放在TreeMap中的順序(在您的示例中取決於在源HashMap迭代時遇到鍵的順序)–生成的Map將始終進行排序。

LinkedHashMap的JavaDoc說:

此鏈表定義了迭代順序,通常是將鍵插入映射的順序(插入順序)。

通過插入HashMap創建LinkedHashMapLinkedHashMap保留HashMap hMap的順序。

HashMap的JavaDoc說:

此類無法保證地圖的順序。 尤其是,

因此, LinkedHashMap lhMap保留了HashMap hMap LinkedHashMap lhMap

另一方面,您使用默認構造函數創建了TreeMap hTree 這意味着您使用“鍵的自然順序創建了一個新的空樹圖 ”。 因此, hTree在每次插入時都進行排序。 插入表示排序。

關於LinkedHashMap ,它自己不進行排序。


進一步閱讀: 對LinkedHashMap進行排序

1)默認情況下,Treemap將使用自然順序對元素進行排序。

2)Linkedhasmap將保持列表的插入順序。

TreeMap按鍵實現的compareTo排序(或在構造時傳遞的比較器函數,比較鍵)。 LinkedHashMap僅保留插入順序,因此我猜您在使用哈希映射創建它時,插入順序與在HashMap上進行迭代時相同。

HashMap不會保留鍵的排序。 此外,請注意,當HashMap實例的大小由於加載因子而改變時,它並不能完全相同地顯示(kv)序列。

LinkedHashMap的“排序”意味着與按鍵值比較排序無關。 相反,它表示插入順序或訪問順序。

插入訂單<2,“ A”>,<1,“ B”>,<3,“ C”>

迭代順序作為插入順序:<2,“ A”>,<1,“ B”>,<3,“ C”>

然后假設實現訪問(get / put)<1,“ B”>迭代順序作為訪問順序的操作:<2,“ A”>,<3,“ C”>,<1,“ B”>

暫無
暫無

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

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