Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别

一、 HashMap

1)底层实现 
数组+链表+红黑树(在JDK1.8中如果链表长度大于8的时候才转换为红黑树)


2)是否线程安全
不支持线程的同步,线程不安全,如需同步,可用Collections的synchronizedMap方法或者使用ConcurrentHashMap,调用这个对象的方法使HashMap具有同步的能力。


3)插入值操作过程


    public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }
 
        // Makes sure the key is not already in the hashtable.
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        Entry<K,V> entry = (Entry<K,V>)tab[index];
        for(; entry != null ; entry = entry.next) {
            if ((entry.hash == hash) && entry.key.equals(key)) {
                V old = entry.value;
                entry.value = value;
                return old;
            }
        }
 
        addEntry(hash, key, value, index);
        return null;
    }


4) 特点
HashMap最多只允许一条记录的键为null,允许多条记录的值为null,然后和插入效率高,但是插入的数据是无序的插入、删除和定位元素,HashMap是最好的选择


5)hashmap什么时候进行扩容
当hashmap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16那么当hashmap中元素个数超过160.75=12的时候就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作。

 

 

 

 

 

 

二、 Hashtable


1)底层实现
它继承自Dictionary类

2)是否线程安全
支持线程的同步,线程安全,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢

 

 

 

 

 

 

 

三、LinkedHashMap


1)底层实现
双向链表+HashMap(LinkedHashMap是继承于HashMap)


2) 是否支持线程安全
不支持线程的同步,线程不安全


3)特点
保存了记录的插入顺序,也就是数据是有序的,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的, 也可以在构造时用带参数,按照应用次数排序,一般在遍历的时候会比HashMap慢,有HashMap的全部特性,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

 

 


四、TreeMap


1)底层实现
红黑树


2)是否线程安全
不支持线程的同步,线程不安全


3)特点
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的

 

 

 

 

五、ConcurrentHashMap


1)底层实现
拓展了Hashtable,底层采用分段的数组+链表实现


2)是否线程安全
支持线程的同步,线程安全,即任一时刻只有一个线程能写ConcurrentHashMap。


3)特点
锁分离技术,段内扩容,ConcurrentHashMap对分开两次操作也是安全的。
 
 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页

打赏

chen.yu

你的鼓励是我最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值