jdk1.8HashMap的底层数据结构是Node数组+链表+红黑树
向HashMap添加键值对时,步骤如下
- 通过哈希函数计算键key的哈希值
- 判断内部数组是否为空或者长度为0,是则调用resize初始化
- 根据哈希值确定数组下标,如果数组对应下标没有数据,则直接插入
- 如果对应下标有数据(哈希冲突)会先判断key是否相同,如果是则覆盖value,否则需要判断该数据是否为红黑树节点,是则向红黑树中插入或覆盖节点,否则向链表中插入或覆盖数据。在链表中插入节点后,如果链表长度大于等于8且数组长度>=64,则把链表转换为红黑树(查询效率O(logN),比链表O(n)快)。提升查询性能,当红黑树节点个数小于6时转为链表
- 如果元素个数超过阈值threshold则调用resize扩容。扩容后重新计算所有已有节点的哈希值并重新分配到新的数组中(称为 rehash)
获取元素时用哈希函数计算键key的哈希值,通过(n - 1) & hash计算数组下标,判断内部数组对应下标数据的key与key是否相等,是则直接返回,否则,判断节点是否为树节点,是则查找红黑树直到找到key相等的,否则遍历链表查找key相等的值,没有则返回null
1811

被折叠的 条评论
为什么被折叠?



