一、HashMap
数组+链表
数组是默认长度是16,自动扩展或初始化时,必须是2的幂。
使用哈希函数计算key的哈希值,根据这个值确定放在数组中的第几个元素,每个元素是一个entry对象(键值对)。默认数组的每个元素都是一个单链表的头结点。
index = HashCode(Key) & (Length -1)
为什么是长度是2的幂:
参考博客:https://blog.csdn.net/Jae_Peng/article/details/79562432
二、HashTable
synchronized+HashMap,线程安全,但多线程争抢同一把锁,耗性能
二、ConcurrentHashMap
jdk1.7:segment数组(固定大小,使用ReentrantLock可重入锁)+数组+链表
jdk1.8:node(可扩展,使用synchronized+CAS)+链表/红黑树(超过8位用红黑树,提升查询效率)
参考博客:
https://blog.csdn.net/stone_tomcate/article/details/100110453