HashMap是什么?
hashmap ==> 容器
存什么
键值对:
k1 -> v1
k2 -> v2
k3 -> v3
数据结构
jdk1.7:数组 + 链表
jdk1.8:数组 + 链表 + 红黑树
常用变量
初始容量:DEFAULT_INITIAL_CAPACITY=16
负载因子:DEFAULT_LOAD_FACTOR=0.75
临界值:threshold=12
临界值 = 初始容量 * 负载因子
put流程
put() 第一次调用时初始化table数组
key在数组索引位(key为null,在table[0])
索引位元素
为null
直接添加
有值
key相同 替换并返回原始值
key不同 遍历链表的next节点并判断key
扩容
1.7 扩容:2 * table.length
添加元素时判断
size大于临界值
当前位置
为null
直接插入
不为null
扩容
1.8 扩容:2 * table.length
添加元素时判断
当前位置
为null
直接插入
不为null且链表长度等于8
数组长度小于64 => 扩容
数组长度大于64 => 转红黑树