对 Map HashMap LinkedHashMap TreeMap 的深入认识

HashMap,LinkedHashMap,TreeMap都属于Map。 


1.基本含义

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

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

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


2.使用场景

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>()); 

3.举例说明

下面是一个 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

[转自]-> http://technique-digest.iteye.com/blog/1129527


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值