-
-我们向hashset中添加元素a,首先调用a所在类的hashcode方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在hashset底层数组中的存放(索引位置),判断此位置上是否已经有元素;
-
如果此位置上没有其他元素,则添加成功–情况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
简称:七上八下
hashset底层:数组+链表
linkedhashset:
作为hashset的子类,在添加元素的同时,每个数据还委会了两个引用,记录此数据的前一个数据和后一个数据,对于频繁遍历的操作,效率高于hashset。
treeset:
-
向treeset中添加的数据,要求时相同类的对象
-
两种排序方式:自然排序(实现comparable接口)和定制排序
-
自然排序中,比较两个对象是否相同的标准为:compareto返回0,不再是equals。