HashMap源码解析-底层数据结构、原理、扩容机制
底层数据结构
- 在JDK1.7之前HashMap是由数组+链表构成的
- 在JDK1.8之后HashMap则由数组+链表+红黑树构成
实现原理
HashMap在put元素的时候,
- 会先计算key的hash值,根据hash值确定在数组中的位置。
- 如果key的hash值相同的话,
- 则会判断key是否equals,如果相等则替换
- 如果不相等,则存在这个数组元素的链表中(桶)
- 如果桶的节点超过8个,链表会转为红黑树,已提高查找效率。时间复杂度从O(n)变为O(logn)
根据hash值怎么确定数组中的位置
"hello".hashcode()
// 输出99162322
- HashMap初始化数组大小为16
- 要确定hash值落在数组索引中,可以采用取余的办法
- 而是采用与操作(相当于取余,速度要更快)
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode