为什么LinkedHashMap无法在TreeMap中对HashMap进行排序?

Dil*_*Dil -1 java collections hashmap treemap linkedhashmap

我正在尝试HashMap使用LinkedHashMap和排序输出TreeMap.

当我用它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() + "    ");
        }
Run Code Online (Sandbox Code Playgroud)

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

但是,当我尝试LinkedHashMap进行排序时,HashMap它似乎不起作用.

        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()+"   ");
        }
Run Code Online (Sandbox Code Playgroud)

输出:

before
20 b    40 d    10 a    30 c     
after
20 b   40 d   10 a   30 c  
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么这种排序不起作用?那是因为LinkedHashMap过滤了HashMap吗?
如果这是为什么TreeMap免疫这个问题?
谢谢

Era*_*ran 7

LinkedHashMap维护广告订单.这意味着如果您传递给构造函数一个已排​​序的Map,或者LinkedHashMap按照排序顺序放置键,它将保持排序.

但是,您将a传递HashMapLinkedHashMap构造函数,并且它没有排序(因为HashMap没有排序).因此,结果LinkedHashMap也没有订购.

另一方面,TreeMap保持按键排序,因此按键的顺序TreeMap(在您的示例中由迭代源上的键遇到的顺序确定HashMap)无关紧要 - 结果Map总是如此被分类.


LuC*_*Cio 6

JavaDoc LinkedHashMap说:

此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序).

通过创建LinkedHashMap插入a HashMap,LinkedHashMap保留了顺序HashMap hMap.

该JavaDoc HashMap说:

这个类不保证地图的顺序; 特别是,

因此HashMap hMap保留的不保证顺序由LinkedHashMap lhMap.

另一方面,您TreeMap hTree使用默认构造函数创建了.这意味着您使用其键的自然顺序创建了" 一个新的空树图. ".因此hTree按每次插入排序.插入意味着排序.

关于LinkedHashMap它本身没有订购.


进一步阅读:排序LinkedHashMap


小智 5

1)Treemap默认使用自然顺序对元素进行排序.

2)Linkedhasmap将像列表一样维护插入顺序.