开发者社区> 问答> 正文

HashMap,HashTable,ConcurrentHash的共同点和区别

HashMap,HashTable,ConcurrentHash的共同点和区别

展开
收起
huc_逆天 2021-01-08 15:38:57 823 0
2 条回答
写回答
取消 提交回答
  • HashMap

    ·底层数组+链表实现, ·可以存储null键和null值, ·线程不安全 ·默认大小: 16, 增长因子:0.75;扩容点规则(什么时候扩容): 160.75=12;扩容方法:扩容为原来的2倍 ·扩容:newsize = oldsize2,size一定为2的n次幂 ·扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入 ·插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容) ·当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀 ·计算index方法:index = hash & (tab.length – 1)

    HashTable

    ·底层数组+链表实现, ·key还是value都不能为null, ·线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 ·默认大小: 11, 增长因子:0.75;扩容点规则(什么时候扩容): 110.75=12,扩容方法:扩容为原来的2倍+1 ·扩容:newsize = olesize2+1 ·计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length

    ConcurrentHashMap

    ·底层结构是散列表(数组+链表)+红黑树,这一点和HashMap是一样的。 ·ConcurrentHashMap的key和Value都不能为null ·Hashtable是将所有的方法进行同步,效率低下。而ConcurrentHashMap作为一个高并发的容器,它是通过部分锁定+CAS算法来进行实现线程安全的。CAS算法也可以认为是乐观锁的一种~ ·在高并发环境下,统计数据(计算size...等等)其实是无意义的,因为在下一时刻size值就变化了。 ·get方法是非阻塞,无锁的。重写Node类,通过volatile修饰next来实现每次获取都是最新设置的值

    2021-02-03 16:16:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载