jdk7 数组+链表
jdk8 数组+链表+红黑树
- hash
也称散列、哈希,基本原理即使把任意长度的输入,通过hash算法变成固定长度的输出。
这个映射的规则就是对应的hash算法,而原始数据映射后的二进制串就是哈希值。
两个对象不同,hashcode肯定不同。hashcode相同,对象不一定相同。
- Node数据结构分析
alt+7:查看当前类所有方法
- hashmap的底层存储结构
node数组,默认长度16,发生hash冲突时会形成链表,当链表长度达到9并且所有元素达到64个,链表结构升级为红黑树。
- put
node里的hash值:先获取key的hashcode,经过扰动函数,使hash值更散列。
路由寻址公式:位运算 h&(length-1) 效率高于 取模运算 hash%length。
容量必须是2的指数次幂,new时指定的如果不是,会初始化成2的指数次幂。
当容量是2的指数次幂时,h&(length-1)==hash%length,且不会造成空间浪费。
- 扩容
以空间换时间
- 缺省常量值
缺省数组大小:1<<4 16
缺省数组最大长度:1<<30
缺省负载因子大小:0.75
树华阈值:8.链表长度超过此值,会升级成树
树降级称为链表的阈值:6
树化的另一个参数,当hash表中的所有元素个数超过64,
jdk1.7 链表头插法
jdk1.8 链表尾插法
元素个数超过容量(数组)的3/4,会扩容。默认初始容量:16