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