当前位置: 首页 > news >正文

【集合框架HashSet底层原理】

本文主要介绍集合框架Set接口下的实现类HashSet底层添加元素机制。

首先,Set接口下的集合的特点一般有三个:无序、不可重复、无索引

其三个实现类的特点也各有异同

我们也可以再次回顾以前的单列集合体系,以确保我们将这些结构熟记于心。

HashSet底层原理:

1、底层采取哈希表存储

2、哈希表是一种对于增删改查数据性能都好的结构

哈希表组成(不同版本):

JDK8之前:数组+链表

JDK8之后:数组+链表+红黑树

什么是哈希值?

哈希值:对象的整数表现形式

存储时会通过公式计算得到所要存储到的位置

1.JDK8以前的底层原理(数组+链表)

a.首先会创建默认length为16,因子为0.75的数组table,存储时根据公式计算index从而确定存入的位置,前提是必须重写hashCode和equals方法。

b.添加第一个元素,计算得index为4且索引4位置为null,则存储到索引4位置。

c.若又计算到索引4且不为null表示有元素,会有两种情况,首先调用equals方法比较内部属性值是否一致,若一样则不存,反之存入数组,形成链表(若再不为null则继续调用equals比较其内部属性值,一样不存不一样则挂入链表)。

注意:jdk8以前遇到这种情况会采用头插法存入。

注意:jdk8以后采用尾插法存入。

d.加载因子(扩容时机)我们一直没用到,其实就是当table数组存入了16 * 0.75 = 12个元素的时候,table数组会扩容至原来的二倍,也就是长度变为32。

2.JDK8以后的底层原理(数组+链表+红黑树)

e.当链表长度大于8,数组长度大于等于64的时候(同时满足),当前的链表会自动转为红黑树。

f.所以jdk8之后是数组+链表+红黑树

3.总结

我们回头再看就会明白HashSet的三个特点为什么是:无序、不可重复、无索引

无序

不可重复

无索引

希望以上内容能帮助大家更好的理解HashSet底层实现原理!

http://www.dtcms.com/a/339085.html

相关文章:

  • IDEA:设置彩色输出
  • DataAnalytics之Tool:Metabase的简介、安装和使用方法、案例应用之详细攻略
  • 项目一系列-第5章 前后端快速开发
  • 虚拟环境安装了fastapi但是使用时报错:ModuleNotFoundError: No module named ‘fastapi‘
  • C++利用CerateProcess创建WPF进程并通过命名管道通讯
  • Scikit-learn通关秘籍:从鸢尾花分类到房价预测
  • 项目部署与持续集成
  • Android RxJava数据库操作:响应式改造实践
  • AUTOSAR进阶图解==>AUTOSAR_SWS_FunctionInhibitionManager
  • Spring Ai Chat Memory
  • Python 与 VS Code 结合操作指南
  • 【Vue开发】在Vite+Vue3项目中实现离线Iconify图标方案
  • 【什么是非晶合金?非晶电机有什么优点?】
  • Redis面试题及详细答案100道(71-85) --- 综合篇
  • Vim笔记:缩进
  • KMM跨平台叛逃实录:SwiftUI与Compose Multiplatform共享ViewModel的混合开发框架(代码复用率85%)
  • Qt5 GUI 编程详解
  • 【AI大模型的发展历史】从Transformer到2025年的多模态、推理与开源革命
  • mlir 类型
  • docker 数据卷、自定义镜像操作演示分享(第二期)
  • 【数据结构】堆和二叉树详解(下)
  • SpringAI——向量存储(vector store)
  • SpringClound——网关、服务保护和分布式事务
  • Redis-缓存-击穿-分布式锁
  • 使用ros2跑mid360的fastlio2算法详细教程
  • 【数据结构】用堆解决TOPK问题
  • 算法训练营day56 图论⑥ 108. 109.冗余连接系列
  • C++---为什么迭代器常用auto类型?
  • 强、软、弱、虚引用
  • 在 Qt C++ 中利用 OpenCV 实现视频处理技术详解