有序的map LinkedHashMap

HashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同(除非在put的时候key已经按照hashcode排序号了,这种几率非常小)
单纯的HashMap是无法实现排序的,这的排序是指,我们将键值对按照一定的顺序put进HashMap里,然后在进行取键值对的操作的时候,是按照put进去的顺序把键值对取出来的。

JAVA在JDK1.4以后提供了LinkedHashMap来帮助我们实现了有序的HashMap!

LinkedHashMap取键值对时,是按照你放入的顺序来取的。

 1 [java] view plain copy print?
 2 import java.util.HashMap;
 3 import java.util.Iterator;
 4 import java.util.LinkedHashMap;
 5 import java.util.Map;
 6 import java.util.Map.Entry;
 7 /**
 8  * @author  TEANA E-mail: [email protected]
 9  * @version 创建时间:2011-1-21 下午02:23:07
10  * @DO      LinkedHashMap与HashMap
11  */
12 public class LinkedMap
13 {
14     public static void main(String[] args)
15     {
16         //LinkedHashMap 有序
17         Map maps = new LinkedHashMap();
18         maps.put("1", "张三");
19         maps.put("2", "李四");
20         maps.put("3", "王五");
21         maps.put("4", "赵六");
22         System.out.println("LinkedHashMap(有序):");
23         Iterator it = maps.entrySet().iterator();
24         while(it.hasNext())
25         {
26             Map.Entry entity = (Entry) it.next();
27             System.out.println("[ key = " + entity.getKey() +
28                     ", value = " + entity.getValue() + " ]");
29         }
30         //HashMap 无序
31         Map map = new HashMap();
32         map.put("1", "张三");
33         map.put("2", "李四");
34         map.put("3", "王五");
35         map.put("4", "赵六");
36         it = null;
37         System.out.println("HashMap(无序):");
38         it = map.entrySet().iterator();
39         while(it.hasNext())
40         {
41             Map.Entry entity = (Entry) it.next();
42             System.out.println("[ key = " + entity.getKey() +
43                     ", value = " + entity.getValue() + " ]");
44         }
45     }
46 }  

2017-05-1817:56:34

执行结果如下:
LinkedHashMap(有序):
[ key = 1, value = 张三 ]
[ key = 2, value = 李四 ]
[ key = 3, value = 王五 ]
[ key = 4, value = 赵六 ]
HashMap(无序):
[ key = 3, value = 王五 ]
[ key = 2, value = 李四 ]
[ key = 1, value = 张三 ]
[ key = 4, value = 赵六 ]

HashMap,LinkedHashMap,TreeMap应用简介
共同点: 
HashMap,LinkedHashMap,TreeMap都属于Map;Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。 
不同点:

1.HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。 
2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。 
3. LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.

 1 [java] view plain copy
 2
 3  print?
 4 import java.util.HashMap;
 5 import java.util.Iterator;
 6 import java.util.LinkedHashMap;
 7 import java.util.Map;
 8 import java.util.TreeMap;
 9 public class MapAppTest {
10 /**
11 * @Create on Nov 9, 2009 by lrm
12 */
13 public static void main(String[] args) {
14    // TODO Auto-generated method stub
15    MapAppTest.noOrder();
16    MapAppTest.hasOrder();
17    MapAppTest.likedHashMap();
18 }
19 public static void noOrder() {
20    System.out.println("------无序(随机输出------");
21    Map map = new HashMap();
22    map.put("1", "Level 1");
23    map.put("2", "Level 2");
24    map.put("3", "Level 3");
25    map.put("4", "Level 4");
26    map.put("F", "Level F");
27    map.put("Q", "Level Q");
28    Iterator it = map.entrySet().iterator();
29    while (it.hasNext()) {
30     Map.Entry e = (Map.Entry) it.next();
31     System.out.println("Key: " + e.getKey() + ";   Value: "
32       + e.getValue());
33    }
34 }
35 // 有序(默认排序,不能指定)
36 public static void hasOrder() {
37    System.out.println("------有序(但是按默认顺充,不能指定)------");
38    Map map = new TreeMap();
39    map.put("F", "Level F");
40    map.put("7", "Level 1");
41    map.put("8", "Level 2");
42    map.put("4", "Level 3");
43    map.put("4", "Level 4");
44    map.put("Q", "Level Q");
45    map.put("E", "Level E");
46    Iterator it = map.entrySet().iterator();
47    while (it.hasNext()) {
48     Map.Entry e = (Map.Entry) it.next();
49     System.out.println("Key: " + e.getKey() + ";   Value: "
50       + e.getValue());
51    }
52 }
53 public static void likedHashMap() {
54    System.out.println("------有序(根据输入的顺序输出)------");
55    Map map = new LinkedHashMap();
56    map.put("F", "Level F");
57    map.put("7", "Level 1");
58    map.put("8", "Level 2");
59    map.put("4", "Level 3");
60    map.put("4", "Level 4");
61    map.put("Q", "Level Q");
62    map.put("E", "Level E");
63    Iterator it = map.entrySet().iterator();
64    while (it.hasNext()) {
65     Map.Entry e = (Map.Entry) it.next();
66     System.out.println("Key: " + e.getKey() + ";   Value: "
67       + e.getValue());
68    }
69 }
70 }     

输出结果: 
------无序(随机输出------
Key: 3;   Value: Level 3
Key: F;   Value: Level F
Key: 2;   Value: Level 2
Key: 4;   Value: Level 4
Key: Q;   Value: Level Q
Key: 1;   Value: Level 1
------有序(但是按默认顺充,不能指定)------
Key: 4;   Value: Level 4
Key: 7;   Value: Level 1
Key: 8;   Value: Level 2
Key: E;   Value: Level E
Key: F;   Value: Level F
Key: Q;   Value: Level Q
------有序(根据输入的顺序输出)------
Key: F;   Value: Level F
Key: 7;   Value: Level 1
Key: 8;   Value: Level 2
Key: 4;   Value: Level 4
Key: Q;   Value: Level Q
Key: E;   Value: Level E

此篇转载自 http://blog.csdn.net/u012889434/article/details/48055679么么哒!!

时间: 2024-11-06 21:40:54

有序的map LinkedHashMap的相关文章

【java】关于Map的排序性的一次使用,有序的Map

关于Map的排序性的一次使用,有序的Map >>>>> hashmap是按key的hash码排序的,而treemap是利用comparator 进行key的自然排序的 /** * 根据商品分类ID * 获取长编码,拿到向上的所有父级商品分类ID * * 根据parentUidList 获取 parentList * * 迭代parentUid 根据uid 获取在有序List中的 下标 * * 按照[k:v][下标:具体信息] * 放入TreeMap 即得到有序的父层商品分类层

有序取出Map集合的元素(自写无喷)

最近写到一个程序,返回了map,但是经过查阅资料,map是没有顺序的,各种查阅资料无果,最后自己写了这个方法.. 1,通过map集合的keySet()方法,获取到一个包含map所有key的Set集合 2,定义一个新的TreeSet集合(TreeSet集合有自动排序功能) 3,将第一步得到的Set集合遍历赋给TreeSet集合,这样所有key都排好序并保存在TreeSet里面 4,然后通过TreeSet的迭代器遍历,并同时根据迭代器返回的key,一个一个取出map里面的value --------

shiro权限框架的使用和一个小问题

shiro-xml中部分配置 <!--shiro的过滤器:名字必须和web.xml中那个没用的过滤器名字一样--> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/>

Java中常见数据结构Map之LinkedHashMap

前面已经说完了HashMap, 接着来说下LinkedHashMap. 看到Linked就知道它是有序的Map,即插入顺序和取出顺序是一致的, 究竟是怎样做到的呢? 下面就一窥源码吧. 1, LinkedHashMap基本结构 LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap. LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现提供所有可选的映射操作,并允许使用n

从头认识java-15.7 Map(7)-TreeMap与LinkedHashMap

这一章节我们来讨论一下Map两个比较常用的实现:TreeMap与LinkedHashMap. 1.TreeMap 特性:按照key来排序 package com.ray.ch14; import java.util.Comparator; import java.util.TreeMap; public class Test { public static void main(String[] args) { TreeMap<Integer, String> map = new TreeMap

图解集合6:LinkedHashMap

初识LinkedHashMap 上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见.非常有用的集合,并且在多线程情况下使用不当会有线程安全问题. 大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序.HashMap的这一缺点往往会带来困扰,因为有些场景,我们期待一个有序的Map. 这个时候,LinkedHashMap就闪亮登

深入理解 hash 函数、HashMap、LinkedHashMap、TreeMap 【中】

LinkedHashMap - 有序的 HashMap 我们之前讲过的 HashMap 的性能表现非常不错,因此使用的非常广泛.但是它有一个非常大的缺点,就是它内部的元素都是无序的.如果在遍历 map 的时候, 我们希望元素能够保持它被put进去时候的顺序,或者是元素被访问的先后顺序,就不得不使用 LinkedHashMap. LinkdHashMap 继承了 HashMap,因此,它具备了 HashMap 的优良特性-高性能.在HashMap 的基础上, LinkedHashMap 又在内部维

Java HashMap LinkedHashMap 区别及原理

HashMap原理 HashMap是Map的一个常用的子类实现.其实使用散列算法实现的. HashMap内部维护着一个散列数组(就是一个存放元素的数组),我们称其为散列桶,而当我们向HashMap中存入一组键值对时,HashMap首先获取key这个对象的hashcode()方法的返回值,然后使用该值进行一个散列算法,得出一个数字,这个数字就是这组键值对要存入散列数组中的下标位置. 那么得知了下标位置后,HashMap还会查看散列数组当前位置是否包含该元素.(这里要注意的是,散列数组中每个元素并非

查询字符串中字母的个数(两种实现方式1,list与set集合 2,map集合)

题目: 取出一个字符串中字母出现的次数.如:字符串:"abcde%^kka27qoq" ,输出格式为:a(2)b(1)k(2)... 第一种方式(set和list结合使用): package itheima; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; /** * .取出一个字符串中字母出现的次数.如:字符串:"