Set:存储无序的、不可重复的数据。
HashSet底层结构:数组+链表。(jdk7)数组+链表+红黑树。(jdk8)
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置)然后,
判断:数组此位置上是否已经元素:
-------- if: 此位置上没其他元素,则元素a添加成功;(1)
-------- else if: 此位置上其他元素b(或以链表形式存在的多个元素)
--------------------则比较元素a与元素b的hash值:
--------------------if: hash值不相同,则元素a添加成功;(2)
--------------------else if: hash值相同;
-------------------------------进而需要调用元素a所在类的equals()方法:判断
-------------------------------if: equals()返回true,元素a添加失败
-------------------------------else: equals()返回false,则元素a添加成功。(3)
对于添加成功的情况(2)和情况(3)而言:元素a 与已经存在指定索引位置上数据以链表的方式存储。
jdk 7 : 元素a放到数组中,指向原来的元素。
jdk 8 : 原来的元素在数组中,指向元素a。
作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历。在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据。对于频繁的遍历操作,LinkedHashSet效率高于HashSet。