其他分享
首页 > 其他分享> > 集合Set:HashSet、LinkedHashSet

集合Set:HashSet、LinkedHashSet

作者:互联网

集合Set:HashSet、LinkedHashSet

Set:存储无序的、不可重复的数据。

  1. 无序性:不等于随机性。存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的。
  2. 不可重复性:保证添加的元素照equals()判断时,不能返回true。即:相同的元素只能添加一个。

一、HashSet 底层分析

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。

二、LinkedHashSet底层分析

作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历。在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据。对于频繁的遍历操作,LinkedHashSet效率高于HashSet。

标签:Set,LinkedHashSet,HashSet,元素,链表,添加,数组
来源: https://blog.csdn.net/weixin_45687815/article/details/118281700