HashMap
1.Hash的理解
把任意长度的输入通过hash算法映射为固定长度的输出,输出的内容就是hash值
2.Hash的特点
- 无法倒推出原值
- 原值细微的变化也会导致结果不同,相同的原值计算后的hash值相同
- 效率高,长文本也能快速计算出hash值
- 冲突概率要小(因为hash的原理是将原值大空间转换为小空间输出,所以必定会导致抽屉原理:10个苹果放到9个抽屉里,必定有个抽屉会放入至少两个苹果)
3.HashMap的结构
JDK1.8以后,HashMap采用的是数组+链表+红黑树的结构,每个数据单元都是一个node结构,node结构中有key、value、next、hash这四个字段。
next字段是发生hash冲突时,当前桶位中的node与冲突的node形成链表需要用到的字段
hash这个字段的值不是key的hashcode()方法返回值,是经过返回值二次加工得到的(haskcodeg高16位^低16位)
4.HashMap的初始数据
hashmap如果没有指定初始值,散列表的长度默认为16
5.HashMap的创建时机
散列表属于懒加载机制,只有在第一次put数据的时候才加载
6.负载因子
HashMap默认的负载因子为0.75,负载因子用来计算表的扩容阈值,比如说默认的长度为16时 扩容阈值就是:16*0.75=