对 Map HashMap LinkedHashMap TreeMap 的深入认识

HashMap,LinkedHashMap,TreeMap都属于Map。

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

HashMap 是一个最常用的Map,它根据键的 HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。

LinkedHashMap LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序
TreeMap 不仅可以保持顺序,而且可以用于排序。

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

Map<String, String> map = Collections.synchronizedMap(new LinkedHashMap<String, String>());


下面是一个 HashMap,LinkedHashMap,TreeMap 的综合使用例子,和简单的性能对比。


package com.chen.java;

import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class TestMap {
public static void main(String[] args) {
Map<Integer, Integer> map = Collections.synchronizedMap(new HashMap<Integer, Integer>());
Random ran = new Random();
long l1 = System.currentTimeMillis();
long l2 = 0;
for (;;) {
map.put(ran.nextInt(1000000), ran.nextInt(1000000));
l2 = System.currentTimeMillis();
if ((l2 - l1) > 2000) {
break;
}
}
long t1 = System.currentTimeMillis();
testHashMap(map);
long t2 = System.currentTimeMillis();
System.out.println("HashMap cost :" + (t2 - t1) + " ms");
testLinkedHashMap(map);
t1 = System.currentTimeMillis();
System.out.println("LinkedHashMap cost :" + (t1 - t2) + " ms");
testTreeMap(map);
t2 = System.currentTimeMillis();
System.out.println("TreeMap cost :" + (t2 - t1) + " ms");
}

public static void testHashMap(Map map) {
Map<Integer, Integer> mymap = new HashMap<Integer, Integer>();
mymap.putAll(map);
for (Iterator it = mymap.values().iterator(); it.hasNext();) {
it.next();
// System.out.println(it.next());
}
}

public static void testLinkedHashMap(Map map) {
Map<Integer, Integer> mymap = new LinkedHashMap<Integer, Integer>();
mymap.putAll(map);
for (Iterator it = mymap.values().iterator(); it.hasNext();) {
it.next();
// System.out.println(it.next());
}
}

public static void testTreeMap(Map map) {
Map<Integer, Integer> mymap = new TreeMap<Integer, Integer>(/*new Comparator<Object>() {
Collator c = Collator.getInstance();
@Override
public int compare(Object o1, Object o2) {
CollationKey key1 = c.getCollationKey(o1.toString());
CollationKey key2 = c.getCollationKey(o2.toString());
return key1.compareTo(key2);
}
}*/);
mymap.putAll(map);
for (Iterator it = mymap.keySet().iterator(); it.hasNext();) {
it.next();
//System.out.println(it.next());
}
}
}


其中一次运行结果如下:

HashMap cost :781 ms
LinkedHashMap cost :219 ms
TreeMap cost :547 ms
展开阅读全文

没有更多推荐了,返回首页