HashTable:
- 数组+链表,无论key、value均不能为null,线程安全的原因是在put和get方法中加了synchronized关键字,但是效率极低,在ConcurrentHashMap中做了相关优化。
- 初始容量为11,扩容方式为原来的2倍+1
- 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
HashMap:
- jdk1.7是数组+链表,但是jdk1.8后就是数组+链表+红黑树(当链表长度大于8时,会转换为红黑树),key、value允许为null值,线程不安全。
- 初始容量为16,扩容方式为2的n次幂(如果不为2的n次幂的话,会发生hash碰撞)
- 计算index方法:index = hash & (tab.length – 1)
ConcurrentHashMap:
- 底层是分段的数组+链表,采用的是锁分段技术,把Map分成了n个Segment,可以保证线程安全都相同,而且效率提高n倍。
- 扩容方式为段内扩容,插入数据前会检测需不需要扩容,避免了无效扩容。