HashSet底层为数组+链表存储数据,根据元素的哈希值确定元素在数组中存储的位置,当哈希值一样时,调用equals()方法,当为true时,则表明数据一样,否则不一样。
我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法计算获取到元素a的哈希值,此哈希值再通过散列函数计算出在HashSet底层数组中存储的位置(索引位置)。判断数组在此位置上是否存存在元素:
情况一:如果此位置上没有其他元素,则直接添加元素a,添加成功。
情况二:如果此位置上存在其他元素b(或者以链表形式存在多个元素),则比较元素a和元素b的哈希值,如果哈希值不同,则直接添加元素a,元素添加成功。
情况三:如果哈希值相同,进而调用元素a和元素b所在类的equals()方法,如果equals()方法返回true,则表明元素a和元素b相同,添加失败,当equals()方法返回false,则表明不同,添加成功。
在添加元素成功后,如果数组此位置上还存在元素,再来新的元素则以链表的形式存储。
JDK7:新来的元素放在数据中,指向数据此处原来的元素。
JDK8:数组原来的元素在数组中,指向新的元素。
简称:七上八下
对于存放在Set容器中的对象,对象对应的类一定要重写equals()和hashCode()方法,以实现对象相等规则,即:相等的对象必须具有相等的散列码。HashSet底层也是数组,初始化长度为16,当使用率超过0.75,就会扩大容量为原来的2倍。
创建hashSet,其实底层创建的是:HashMap<>();
public HashSet() {
map = new HashMap<>();
}
LinkedHashSet:作为HashSet的子类,在添加数据时,每个数据维护了两个引用,记录了此数据的前一个数据和后一个数据。优点:遍历效率高,要高于HashSet。
Hashset集合的新增过程
最新推荐文章于 2024-02-01 16:07:14 发布