Set系列集合特点
- 无序:添加数据的顺序和获取数据的顺序不一致。
- 不重复:不允许重复数据出现。
- 无索引
HashSet:无序、不重复、无索引;
LinkedHashSet:有序、不重复、无索引;
TreeSet:排序、不重复、无索引;
哈希值
- 就是一个int类型的数值,Java中每个对象都有一个哈希值。
- Java中所有对象都可以调用Object提供的hashCode方法,返回该对象自己的哈希值。
- public int hashCode(): 返回对象的哈希值。
对象哈希值的特点
- 同一个对象多次调用hashCode所返回的哈希值相同。
- 不同对象调用hashCode返回的哈希值可能相同。
hashSet的底层原理
- 基于哈希表实现。
- jdk8之前,哈希表=数组+链表
- jdk8之后,哈希表=数组+链表+红黑树
Jdk8之前的hashSet的底层原理
- 创建一个默认长度为16的数组,装填因子为0.75,数组名为table
- 使用元素的哈希值对数组的长度求余,计算出应存入的位置
- 判断当前位置是否为null,为null直接存入
- 如果当前位置不为null,表示为有元素,则调用equals方法比较。相等,则不存;不相等,则存入数组。
- Jdk8之前,新元素进入数组,占老元素位置,放老元素下面。
Jdk8之后的 hashSet的底层原理
- 当链表长度>8,且数组长度>=64,自动将链表转换成红黑树。
LinkedhashSet的底层原理
- 依旧是基于哈希表(数组+链表+红黑树)
- 它的每个元素都是基于双链表的机制记录它前后的元素。
TreeSet的底层原理
- 基于红黑树实现的排序。