Set中不可重复性保证添加的元素按照equals()判断时,不能返回true,即:
相同的元素只能添加一个
-
Set添加元素的过程:
以HashSet为例:
我们向HashSet添加元素a,首先调用a所在类的hashCode()方法,计算a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中存放位置(即为索引),接着判断数组在此位置上是否有元素
-
如果此位置上有没有其他元素,则a直接添加到此数组中相应的索引位置上 ①
-
如果此位置上有其他元素b(或一链表形式存在的多个元素),则比较元素a与元素b的hash值:
-
如果hash值不相同,则a添加成功 ②
-
如果hash值相同,则需调用元素a所在类的equals()方法比较元素是否相同
-
如果equals返回true,元素a添加失败
-
如果equals返回false,元素a添加成功 ③
-
-
注:
对于添加成功的②和③而言: (即以链表形式存储的元素)
-
元素a与已经存在指定索引位置上数据以链表的方式存储
jdk7: 元素a放到数组中,指向原来的元素
jdk8: 原来的元素在数组中,指向元素a
总结: 七上八下