set的实现类
/**
- Set框架结构
- Collection接口:单列集合,用于存储一个一个的数据
- Set接口 存储无序的 不可重复的数据 --》高中将的集合
- HashSet 作为Set接口的主要实现类 线程不安全的 可以存储 null
- 1、无序性:不等于随机性。存储的数据在底层数组中并非按照索引的顺序添加。而是根据数据的哈希值
- 2、不可重复性:保证添加的元素按照equals()判断时 不能返回true
- 添加元素的过程:HashSet为例
- 我们向HashSet中添加元素a,首先调用元素a所在类的hasCode()方法 去计算元素a的hash值
- 此hash值通过某种算法 计算出hashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素,
- 如果此位置没有元素则a添加成功。 --------》情况1
- 如果此位置上有其他元素b或以链表形式存在的多个元素,则比较元素a与元素b的hash值,
- 如果hash值不相同则a添加成功 ----------》情况2
- 如果hash值相同需要调用元素a的equals方法
-
equals()返回true 元素a 添加失败
-
equals()返回false 则元素a添加成功------------》情况3
-
对于添加的情况2和3情况而言:元素a与已经在指定索引位置上数据以链表的方式存储
-
jdk7:元素a放到数组中,指向原来的 元素
-
jdk8 :原来的元素在数组中,指向元素a
- LinkedHashSet HashSet的子类 在HashSet方面上加了一个指针(链表)
- TreeSet 可以安装添加对象的指定属性 进行排序
*/