owo
底层原理
- 创建默认长度 16 ,默认加载因子为 0.75 的数组 table ,当数组中存放超过 16 * 0.75 = 12 个元素,数组扩容,长度为原来2倍
- 根据元素的哈希值和数组的长度计算出应存入的位置 pos = (len−1)&hashCode
- 判断当前位置是否为 null ,若 null 则直接存入
- 如果不为 null
,调用
equals方法依次比较此位置上所有元素属性值,若有一个相同,则不存入,否则放在这个元素链尾(新元素挂在老元素下面) - 若数组长度大于 64 ,有一个位置元素链长度大于 8 ,则此元素链转为红黑树
版本差异
JDK8以前
- 数组+链表
- 新元素存入数组,老元素挂在新元素下面
JDK8以后
- 数组+链表+红黑树
- 新元素存入数组,直接挂在老元素下面
- 链表长度超过8,数组长度大于等于64时,链表转为红黑树
注意事项
hashCode默认用地址,不同的对象就算属性值相同也不一定哈希相同- 若集合中存储的是自定义对象,必须重写
hashCode和equals方法