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

HashMap

  • 底层由链表+数组+红黑树实现

  • 可以存储null键和null值

  • 线性不安全

  • 初始容量为16,扩容每次都是2的n次幂

  • 加载因子为0.75,当Map中元素总数超过Entry数组的0.75,触发扩容操作.

  • 并发情况下,HashMap进行put操作会引起死循环,导致CPU利用率接近100%

  • HashMap是对Map接口的实现

HashTable

  • HashTable的底层也是由链表+数组+红黑树实现。

  • 无论key还是value都不能为null

  • 它是线性安全的,使用了synchronized关键字。

  • HashTable实现了Map接口和Dictionary抽象类

  • Hashtable初始容量为11

ConcurrentHashMap

  • ConcurrentHashMap的底层是数组+链表+红黑树

  • 不能存储null键和值

  • ConcurrentHashMap是线程安全的

  • ConcurrentHashMap使用锁分段技术确保线性安全

  • JDK8为何又放弃分段锁,是因为多个分段锁浪费内存空间,竞争同一个锁的概率非常小,分段锁反而会造成效率低。

最后更新于