作者:徐小倩是你叫的 | 来源:互联网 | 2022-12-05 09:50
我正在尝试HashMap
使用LinkedHashMap
和排序输出TreeMap
.
当我用它TreeMap
来理清HashMap
它就像一个魅力.
Map hMap = new HashMap();
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 hTree = new TreeMap(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
但是,当我尝试LinkedHashMap
进行排序时,HashMap
它似乎不起作用.
Map hMap = new HashMap();
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 lhMap = new LinkedHashMap(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
免疫这个问题?
谢谢
1> Eran..:
LinkedHashMap
维护广告订单.这意味着如果您传递给构造函数一个已排序的Map
,或者LinkedHashMap
按照排序顺序放置键,它将保持排序.
但是,您将a传递HashMap
给LinkedHashMap
构造函数,并且它没有排序(因为HashMap
没有排序).因此,结果LinkedHashMap
也没有订购.
另一方面,TreeMap
保持按键排序,因此按键的顺序TreeMap
(在您的示例中由迭代源上的键遇到的顺序确定HashMap
)无关紧要 - 结果Map
总是如此被分类.
2> LuCio..:
JavaDoc LinkedHashMap
说:
此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序).
通过创建LinkedHashMap
插入a HashMap
,LinkedHashMap
保留了顺序HashMap hMap
.
该JavaDoc HashMap
说:
这个类不保证地图的顺序; 特别是,
因此HashMap hMap
保留的不保证顺序由LinkedHashMap lhMap
.
另一方面,您TreeMap hTree
使用默认构造函数创建了.这意味着您使用其键的自然顺序创建了" 一个新的空树图. ".因此hTree
按每次插入排序.插入意味着排序.
关于LinkedHashMap
它本身没有订购.
进一步阅读:排序LinkedHashMap
3> 小智..:
1)Treemap默认使用自然顺序对元素进行排序.
2)Linkedhasmap将像列表一样维护插入顺序.