Java-HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap大杂烩比较

Java 中常见的Map类大概就这些吧,汇总一下,如果漏掉了什么以后再补上。

线程安全 key排序 内部结构 特性 不足处
HashMap 不安全 乱序 hash数组+拉链法(红黑树)处理冲突 - 乱序,不安全
LinkedHashMap 不安全 插入顺序(默认)/访问顺序 hash数组+拉链法(红黑树)处理冲突 每个节点增加before/after指针,实现排序 不安全
TreeMap 不安全 按key值大小排序 红黑树 使用红黑树实现基于key的排序 速度慢
Hashtable 安全 乱序 hash数组+拉链法处理冲突 对方法增加synchronized实现线程安全 速度慢
ConcurrentHashMap 安全 乱序 hash数组+拉链法(红黑树)处理冲突 将hash数组分为数个segment,实现segment间多线程访问,提升效率 不安全
    HashMap hm = new HashMap<>();
    TreeMap tm = new TreeMap<>();
    LinkedHashMap lm = new LinkedHashMap<>();
    hm.put(20,"2");
    hm.put(30,"3");
    hm.put(10,"1");
    hm.put(40,"4");
    for (Map.Entry e:hm.entrySet())
        System.out.println(e);
    System.out.println();
    tm.put(20,"2");
    tm.put(30,"3");
    tm.put(10,"1");
    tm.put(40,"4");
    for (Map.Entry e:tm.entrySet())
        System.out.println(e);
    System.out.println();
    lm.put(20,"2");
    lm.put(30,"3");
    lm.put(10,"1");
    lm.put(40,"4");
    for (Map.Entry e:lm.entrySet())
        System.out.println(e);

运行结果:

20=2
40=4
10=1
30=3

10=1
20=2
30=3
40=4

20=2
30=3
10=1
40=4

可以看到,HashMap(第一个)输出是乱序的,TreeMap(第二个)根据key值大小排序,LinkedHashMap(第三个)根据插入顺序排序。

你可能感兴趣的:(Java-HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap大杂烩比较)