HashMap
1. 初始化
1. 初始容量(默认是16)
2. 负载因子(默认是0.75)
3. 容量的数量就是桶的数量; 当超过负载因子*容量这个阈值,那么hashmap就会扩容
2. put操作
1. 当key为null时
1. 判断null的桶是否为空,
为空,直接插入一个Entry
不为空,替换该Entry的value值
2. 当key不为null
2. 计算key hashcode的hash值
3. 计算hash值所在的桶位置
4. 判断桶位置是否已经存在数据
1. 没有数据,那么就桶的头部插入该键值对
2. 如果有数据,那么就判断链表中的每一个数据的key equal 新加的key
如果相等,那么直接替换value
如果不相等,那么就在桶的头部插入该键值对
3. addEntry添加Entry操作
1. 根据桶的索引,获取链表
2. 新建一个Entry节点插入链表
3. 如果有需要,扩容,当前容量的2倍
4. get操作
1. 当key为null
1. 获取value值(可以为null)
2. 当key不为null
1. 获取桶位置
2. 在链表中判断等key的value,返回该value
3. 不存在key
返回null值
ConcurrentHashMap
1. put操作
1. value为null抛出异常
2. value不为null
1. 通过hash的高位获取segmens的索引值
2. 对segment上锁
3. 容量不满足,扩容
4. 定位到具体的桶
5. 在桶上判断key是否存在
1.如果存在替换新值,返回旧值
2. 如果不存在 添加一个节点,放置在链表头部,返回null
6. 释放锁
2. get操作
1. 根据hash定位到段,委托segment.put()
2. 判断是否有桶的hash值与hash值相等
1. 如果相等找到指定value
1 value为null
加锁从新获取
2 value不为nul
返回value
2. 如果不相等
返回null
3. rehash操作
1. 扩容2倍
2. 在具体的segment上重哈希
3. 重哈希都是针对单独的一个segment进行操作,也就是说最后个个段上桶的数量可能不相等