关于HashMap、LinkedHashMap与TreeMap

HashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同(除非在put的时候key已经按照hashcode排序号了,这种几率非常小)

单纯的HashMap是无法实现排序的,这的排序是指,我们将键值对按照一定的顺序put进HashMap里,然后在进行取键值对的操作的时候,是按照put进去的顺序把键值对取出来的。

JAVAJDK1.4以后提供了LinkedHashMap来帮助我们实现了有序的HashMap

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

顾名思义LinkedHashMap是比HashMap多了一个链表的结构。与HashMap相比LinkedHashMap维护的是一个具有双重链表的HashMap,LinkedHashMap支持2中排序一种是插入排序,一种是使用排序,最近使用的会移至尾部例如 M1 M2 M3 M4,使用M3后为 M1 M2 M4 M3了,LinkedHashMap输出时其元素是有顺序的,而HashMap输出时是随机的,如果Map映射比较复杂而又要求高效率的话,最好使用LinkedHashMap,但是多线程访问的话可能会造成不同步,所以要用Collections.synchronizedMap来包装一下,从而实现同步。其实现一般为:
    Map<String String> map = Collections.synchronizedMap(new LinkedHashMap(<String String));

 

HashMap,LinkedHashMap,TreeMap都属于Map

Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。

HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMap LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序
TreeMap 不仅可以保持顺序,而且可以用于排序
View Code
 1 import java.text.CollationKey;
2 import java.text.Collator;
3 import java.util.Comparator;
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
10 public class HashMapLinkedHashMap
11 {
12 public static void main(String args[])
13 {
14 System.out.println("*************************LinkedHashMap*************");
15 Map<String,String> linkedHashMap = new LinkedHashMap<String,String>();
16 linkedHashMap.put("3", "apple");
17 linkedHashMap.put("2", "pear");
18 linkedHashMap.put("4", "origane");
19 linkedHashMap.put("1","banana");
20
21 for (Iterator it = linkedHashMap.keySet().iterator();it.hasNext();)
22 {
23 Object key = it.next();
24 System.out.println( key+"="+ linkedHashMap.get(key));
25 }
26
27 System.out.println("*************************HashMap*************");
28 Map<String,String> haspMap = new HashMap<String,String>();
29 haspMap.put("3", "apple");
30 haspMap.put("2", "pear");
31 haspMap.put("4", "origane");
32 haspMap.put("1","banana");
33 for (Iterator it = haspMap.keySet().iterator();it.hasNext();)
34 {
35 Object key = it.next();
36 System.out.println( key+"="+ haspMap.get(key));
37 }
38
39 System.out.println("*************************TreeMap*************");
40 Map<String,String> treeMap = new TreeMap<String, String>(
41 new Comparator<Object>()
42 {
43 Collator collator = Collator.getInstance();
44 public int compare(Object o1,Object o2)
45 {
46 CollationKey key1 = collator.getCollationKey(o1.toString());
47 CollationKey key2 = collator.getCollationKey(o2.toString());
48 return key1.compareTo(key2);
49 }
50 });
51 treeMap.put("3", "apple");
52 treeMap.put("2", "pear");
53 treeMap.put("4", "origane");
54 treeMap.put("1","banana");
55 for (Iterator it = treeMap.keySet().iterator();it.hasNext();)
56 {
57 Object key = it.next();
58 System.out.println( key+"="+ treeMap.get(key));
59 }
60
61 }
62
63
64 }

运行结果:

*************************LinkedHashMap*************
3=apple
2=pear
4=origane
1=banana
*************************HashMap*************
3=apple
2=pear
1=banana
4=origane
*************************TreeMap*************
1=banana
2=pear
3=apple
4=origane




posted on 2012-03-26 10:38  Paul_bai  阅读(1576)  评论(0编辑  收藏  举报

导航