`

对 Map HashMap LinkedHashMap TreeMap 的深入认识

    博客分类:
  • java
阅读更多
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 维护的是一个具有双重链表的HashMap,LinkedHashMap 支持两种排序,一种是插入排序,一种是使用排序,最近使用的会移至尾部例如 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 的综合使用例子,和简单的性能对比。

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



0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics