首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【集合框架HashSet底层原理】

【集合框架HashSet底层原理】

作者头像
艾伦耶格尔
发布2025-08-28 15:53:00
发布2025-08-28 15:53:00
840
举报
文章被收录于专栏:Java基础Java基础

本文主要介绍集合框架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底层实现原理!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.JDK8以前的底层原理(数组+链表)
  • 2.JDK8以后的底层原理(数组+链表+红黑树)
  • 3.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档