JAVA集合Set之LinkedHashSet详解

JAVA集合Set之LinkedHashSet详解LinkedHashSe 是 Set 集合的一个实现 具有 set 集合不重复的特点 同时具有可预测的迭代顺序 也就是我们插入的顺序 并且 linkedHashSe 是一个非线程安全的集合 如果有多个线程同时访问当前 linkedhashse 集合容器 并且有一个线程对当前容器中的元素做了修改 那么必须要在外部实现同步保证数据的冥等性 下面我们 new 一个新的 LinkedHashSe 容器看一下具体的源码实现

LinkedHashSet是Set集合的一个实现,具有set集合不重复的特点,同时具有可预测的迭代顺序,也就是我们插入的顺序。

并且linkedHashSet是一个非线程安全的集合。如果有多个线程同时访问当前linkedhashset集合容器,并且有一个线程对当前容器中的元素做了修改,那么必须要在外部实现同步保证数据的冥等性。

下面我们new一个新的LinkedHashSet容器看一下具体的源码实现。并分析师如何保证数据的插入顺序:

Set

set = new LinkedHashSet<>();

跟进LinkedHashSet可以得到super一个父类初始化为一个容器为16大小,加载因子为0.75的Map容器。

JAVA集合Set之LinkedHashSet详解

JAVA集合Set之LinkedHashSet详解

实际创建的是一个LinkedHashMap带有制定大小和加载因子的容器。

在前面讲过一次,map的容器的大小必须是2的冥,那么在讲一次如何保证必须是2的冥,通过我们传入的参数在构建map集合的是通过位运算实现:

JAVA集合Set之LinkedHashSet详解

其中initialCapacity为我们传入的具体按容器的大小。

上面是我们描述的LinkedHashSet的具体构建过程,以及构建的具体内容。

由于LinkedHashSet是一个哈希表和链表的结合,且是一个双向链表,那么我们来看一下什么是双向连边?

双向链表是链表的一种,他的每个数据节点都有两个指针分别指向直接后继和直接前驱,所以从双向链表的任意一个节点开始都可以很方便的访问它的前驱节点和后继节点。这是双向链表的优点,那么有优点就有缺点,缺点是每个节点都需要保存当前节点的next和prev两个属性,这样才能保证优点。所以需要更多的内存开销,并且删除和添加也会比较费时间。

下面我们图示一个双向两表的节点:

JAVA集合Set之LinkedHashSet详解

多个节点相互连接,保证了数据录入的顺序。

那么我们源码分析一下具体的录入详情:

我们定义一个LinkedHashSet—LinkedHashSet

set = new LinkedHashSet<>();

然后set.add();跟一下这个add是走的那个方法:

JAVA集合Set之LinkedHashSet详解

跟进来走的是put的方法:LinkedHashSet.class下的,这个是重写了超类中put的具体add方法。他会在新分配的元素在链表的末尾插入一条。

JAVA集合Set之LinkedHashSet详解

JAVA集合Set之LinkedHashSet详解

进来走的还是HashMap的put添加方法,在上面的判断和计算hash确定位置之后,由于LinkedHashSet重写了addEntry

JAVA集合Set之LinkedHashSet详解

在元素的后面添加新的元素。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225245.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午9:45
下一篇 2026年3月17日 上午9:45


相关推荐

  • C语言实现学生成绩管理系统(EasyX图形界面)

    C语言实现学生成绩管理系统(EasyX图形界面)我的小站——半生瓜のblog代码文件下载链接——链接学生成绩管理系统学生成绩管理系统效果图流程&注意要点代码实现学生成绩管理系统效果图流程&注意要点核心部分——EasyX显示图形界面,结构体数组和文件操作负责对数据进行各种操作。只要一进去程序就对存储数据的文件进行读取,如果有数据直接读到学生结构体数组里面,得到当前结构体数组中的数据数量(几个人),并将所有数据打印到屏幕上。管理员用户输入密码验证——读取文件——验证用户输入是否正确。显示所有数据——如果通过文件.

    2022年6月20日
    65
  • 2021年Java后端开发学习路线(建议收藏!)

    2021年Java后端开发学习路线(建议收藏!)2021 的 Java 后端开发的学习路线欢迎使用 Markdown 编辑器大家好 这是你第一次写 CSDN 的博客 下面我为大家来介绍一下 2021 年学习 Java 的路线 让初学者少走弯路跟着路线走 一定可以找到心仪的 offer 还请大家不吝赐教 学习路线大致分为十部分和一个扩展 第一部分 Java 基础 Java 基础部分 初学者在初学 Java 时一定不要好高骛远 认认真真打好基础才行 虽然基础部分有点枯燥无味但是选择了就得坚持下去 罗马并非一日建成 如今基础课程娱乐混杂 选对精品很重要 B 站上很多视频 大家可以去试听

    2026年3月20日
    3
  • 虚拟机centos 7网络配置

    虚拟机centos 7网络配置新手虚拟机网络配置方法

    2022年5月4日
    38
  • mysql全文索引实现搜索功能(关键词查询)

    mysql全文索引实现搜索功能(关键词查询)最近在做一个关键词查询功能。所以开始了解mysql的全文索引技术。接下来我将一步一步告诉大家。我是如何一步一步实现关键词检索的。1.了解到mysql全文检索是以词为基础的。MySQL默认的分词是所有非字母和数字的特殊符号都是分词符。所以我存在数据库的样子是这样的。(左边的字段用于显示,右边的字段用于全文查询)2.全文检索的sqlSELECT*FROMtbk_item_coupon…

    2022年6月21日
    51
  • 微微一笑很倾城(2)「建议收藏」

    微微一笑很倾城(2)「建议收藏」微微一笑很倾城正文第30章  组队前,雷神妮妮想死。  组队后,看到队伍里那一排ID,雷神妮妮瞬间回光返照HP全满了。  就像老话说的那样,一个妮妮被雷劈了,千万个妮妮在电闪雷鸣中站起来了!一切为了八卦!握拳!  电脑前的雷神妮妮死死的盯着屏幕,小眼放出百万瓦特的邪光,左手牢牢的按着截图键,心里不停的默念:来吧!来点火花吧!  可惜,时间一分一秒过去了,她期待的火花却一直没有…

    2022年5月5日
    137
  • JAVA运用dos命令强制删除文件夹

    JAVA运用dos命令强制删除文件夹在对文件夹进行操作时,如果用file.deleate()方法,有时候恐怕不凑效.用了第三方的FileUtils的forceDeleteFile()还是不凑效,所以,自己就用java写一个基于dos命令的方法来实现强制删除文件夹.这并没有什么难的,只要知道dos命令,在java文件中调用runtime就好办了.在这里为写了三个方法:删除某个文件目录;删除某个文件(不是文件夹)和清空某个文件夹下

    2022年6月8日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号