最近做项目,用到了Map向前端传数据,在调用过程中发现Map中的数据并不是按顺序输出的,原因其实非常简单,我们常常实现Map的时候,都是采用HashMap,很容易忽略其链表形式的LinkedHashMap()
使用HashMap,代码如下
public static void main(String[] args) {
Map<String, String> hashMap = new HashMap<String, String>();
hashMap.put("张三", "aaa");
hashMap.put("李四", "bbb");
hashMap.put("王五", "ccc");
hashMap.put("刘六", "ddd");
hashMap.put("田七", "eee");
for(int i = 0;i<100;){
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
System.out.println("hashKey= " + entry.getKey() + "\t" + "hashValue = " + entry.getValue());
}
i++;
System.out.println("\r\n");
}
}
运行结果如下:
结果当然不是我们想要的,怎么办,很简单,把HashMap换成LinkedHashMap
public static void main(String[] args) {
Map<String, String> hashMap = new HashMap<String, String>();
Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();
hashMap.put("张三", "aaa");
hashMap.put("李四", "bbb");
hashMap.put("王五", "ccc");
hashMap.put("刘六", "ddd");
hashMap.put("田七", "eee");
linkedHashMap.put("张三", "aaa");
linkedHashMap.put("李四", "bbb");
linkedHashMap.put("王五", "ccc");
linkedHashMap.put("刘六", "ddd");
linkedHashMap.put("田七", "eee");
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
System.out.println("hashKey= " + entry.getKey() + "\t" + "hashValue = " + entry.getValue());
}
System.out.println("\r\n");
for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
System.err.println("linkKey= " + entry.getKey() + "\t" + "linkValue = " + entry.getValue());
}
}
运行结果如下:
原因:LinkedHashmap 的特点是put进去的对象位置未发生变化,而HashMap会发生变化.
拓展 :LinkedHashMap和hashMap和TreeMap的区别
- LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。
- HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。
- HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。
- LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。
LinkedHashMap是线程不安全的。 - TreeMap中默认的排序为升序,如果要改变其排序可以自己写一个Comparator