线程不安全的,继承AbstractMap,实现Map接口
key和value都可以为null
数据结构(jdk1.8):数组+链表/红黑树
扩容因子默认为0.75
初始容量为16
扩容时容量值:是当前容量的2倍,即2capacity
扩容后新阈值:扩容因子*容量
获取元素索引:路由寻址法(计算公式:hash&(table.length-1))
转化红黑树的条件:链表长度>8,且表的长度>64
put加入节点后才会进行初始化,put时存在多种情况:
- HashMap为null,扩容,初始化
- HashMap不为null,判断hash值是否冲突
- 不冲突,直接插入到数组中对应位置
- 冲突,判断是链表,还是树
- 链表,for遍历,key相等,替换value和next
- 链表,for遍历,key不相等
- <=8直接插入
- >8进入树化方法(表的长度<64,扩容)
- 树
put加入节点后,发现size(键值对数量)>threshold时,进行扩容