首页 > 其他分享 >Set集合以及其中实现类的底层原理分析

Set集合以及其中实现类的底层原理分析

时间:2024-04-09 10:11:59浏览次数:25  
标签:Set HashSet hashCode 索引 哈希 集合 重写 底层

Set集合的特点

无序:存取顺序不一致
如存入张三、李四、王五。而遍历获取到的是李四, 张三, 王五
不重复:可以去除重复
无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素

set集合的实现类

HashSet:无序、不重复、无索引
LinkedHashSet:有序、不重复、无索引
TreeSet:可排序、不重复、无索引

hashset

HashSet 集合底层采取哈希表存储数据
哈希表是一种对于增删改查数据 性能都较好的结构
哈希值:对象的整数表现形式
它是根据hashCode方法算出来的int类型的整数
该方法定义在Object类中,所有对象都可以调用,没有重写则默认使用地址值进行计算
一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值

jdk8 及以后的 HashSet 的底层原理。

![](/i/l/?n=24&i=blog/3374466/202404/3374466-20240409100346024-996863832.png)

创建 HashSet 集合后,会在底层创建一个长度为 16 的数组 table,并加载 负载因子为0.75 的 HashMap

这意味着当 HashSet 中的元素数量达到数组长度的 75% 时,数组会进行扩容(原有长度*2)操作,以保持较低的碰撞率和良好的性能。


判断当前位置是否为 null,如果是 null 直接存入

如果不是 null,表示有元素,则调用 equals 方法比较属性值

一样则不存,不一样则存入,形成链表

注意: jdk8 以前:新元素存入数组,老元素挂在新元素下面,jdk8及以后:新元素直接挂在老元素下面。如图:

注意:当链表长度大于 8 并且 数组长度 大于等于 64 时,链表会变成红黑树。如图:![]

(/i/l/?n=24&i=blog/3374466/202404/3374466-20240409100452744-1394440810.png)
注意点:
如果集合中存储的是自定义对象 ,必须要重写 hashCode 和 equals 方法(有的类已经重写过了,如 String Integer,会自动去重)不然 操作的都是地址值(一般来说,我们对于地址值是没有需求的)。

重写 hashCode 是为了通过属性值计算哈希值

重写 equals 是为了比较对象内部属性

标签:Set,HashSet,hashCode,索引,哈希,集合,重写,底层
From: https://www.cnblogs.com/wdkk/p/18123273

相关文章

  • vivado 使用“Set Up Debug”Wizard 来插入调试核
    使用“SetUpDebug”Wizard来插入调试核标记要调试的信号线(net)后,下一步是将其分配到调试核。VivadoDesignSuite提供了易于使用的“设置调试(SetupDebug)”Wizard,以帮助逐步指导您完成自动创建调试核并将调试信号线分配至核的输入的整个过程......
  • 建立时间(setup time)和保持时间(hold time)
    一、基本概念1、建立时间就是时钟触发事件来临之前,数据需要保持稳定的最小时间,以便数据能够被时钟正确的采样。2、保持时间就是时钟触发事件来临之后,数据需要保持稳定的最小时间,以便数据能够被电路准确的传输。可以通俗的理解为:时钟到来之前,数据需要提前准备好;时钟到来之后,数据......
  • MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用
    数据结构我们知道MySQL的存储引擎Innodb默认底层是使用B+树的变种来存储数据的下面我们来复习一下B树存储+B树存储 +哈希存储的区别哈希存储,只能使用等值查询B树与B+树存储我们知道B+树实际上就是B树的变种那么为啥使用B+树而不是使用B树呢?我们知道效率的高低......
  • RuleEngine规则引擎底层改造AviatorScript 之函数执行
    https://gitee.com/aizuda/rule-engine-open需求:使用上述开源框架进行改造,底层更换成AviatorScript,函数实现改造。原本实现方式@OverridepublicObjectrun(ExecuteFunctionRequestexecuteTestRequest){IntegerfunctionId=executeTestRequest.ge......
  • [React] Using key prop to reset component to avoid useEffect hook
    ThecomponentusinguseEffectwhichisnotnecessary:functionTopicEditor({selectedTopicId}){const[enteredNote,setEnteredNote]=useState('');constselectedTopic=DUMMY_TOPICS.find(topic=>topic.id===selectedTopicId)......
  • Python集合
    在Python中,集合是一种无序、可变的数据类型,用于存储不重复的元素。Python提供了两种内置的集合类型:set和frozenset。set(集合):set是可变的,意味着可以对其进行增删改操作。通过花括号{}或者使用set()函数来创建集合。集合中的元素是不可重复的,因此添加重复元素不会引发错......
  • sql server 分页语句OFFSET 和 FETCH NEXT 怎样使用?
    原文链接:https://blog.csdn.net/weixin_45659376/article/details/107336143在SqlServer2012之前,实现分页主要是使用ROW_NUMBER(),在SQLServer2012,可以使用Offset...RowsFetchNext...Rowsonly的方式去实现分页数据查询。在OrderBy子句中新增Offset-Fetch子句,用于从有......
  • @JSONField 坑点 结论:若属性是私有的,必须有set*方法。否则无法反序列化。
    @JSONField坑点结论:若属性是私有的,必须有set*方法。否则无法反序列化。@JSONField坑点结论:若属性是私有的,必须有set*方法。否则无法反序列化。原因:主要原因是JSONField注解是通过反射来操作对象的属性的,而在Java类中一般情况下,字段是私有的,不能直接访问。所以需要......
  • Array and Set work process
    目录Arrayworkprinciple分析Array操作步骤数readfindinsertdeleteSetworkprinciple分析Set操作步骤数readfindinsertdeleteJavaCollectionClass从单词来看,Array很好理解一批一批的意思;Set含义比较多,常见有放、集合、一套...;从字面来记忆它们的区别,Array就是一批一批......
  • 【26.1】Django框架之settings配置
    【一】引言Django项目的设置文件位于项目同名目录下,名叫settings.py。这个模块,集合了整个项目方方面面的设置属性,是项目启动和提供服务的根本保证。【二】简述settings.py文件本质上是一个Python模块,带有模块级别的变量。下面是一些示例设置:ALLOWED_HOSTS=['www.examp......