Java集合中的Set之LinkedHashSet详解

 更新时间:2023年09月04日 09:03:35   作者:X-TIE  
这篇文章主要介绍了Java集合中的Set之LinkedHashSet详解,LinkedHashSet是Set集合的一个实现,具有set集合不重复的特点,同时具有可预测的迭代顺序,也就是我们插入的顺序,并且linkedHashSet是一个非线程安全的集合,需要的朋友可以参考下

Set中的LinkedHashSet

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

并且linkedHashSet是一个非线程安全的集合。

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

下面我们new一个新的LinkedHashSet容器看一下具体的源码实现。

并分析师如何保证数据的插入顺序:

Set<String> set = new LinkedHashSet<>();

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

构造一个空连接散列集合

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

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

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

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

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

双向链表是链表的一种,他的每个数据节点都有两个指针分别指向直接后继和直接前驱,所以从双向链表的任意一个节点开始都可以很方便的访问它的前驱节点和后继节点。

这是双向链表的优点,那么有优点就有缺点,缺点是每个节点都需要保存当前节点的next和prev两个属性,这样才能保证优点。

所以需要更多的内存开销,并且删除和添加也会比较费时间。

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

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

源码分析

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

我们定义一个LinkedHashSet

LinkedHashSet<String> set = new LinkedHashSet<>();

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

跟进来走的是put的方法:LinkedHashSet.class下的,这个是重写了超类中put的具体add方法。

他会在新分配的元素在链表的末尾插入一条。

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

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

整个过程就是LinkedHashSet在容器插入数据的过程。

此过程主要由LinkedHashSet.class中重写超类的两个addEntry和createEntry 实现双向链表的结构。

保证数据已我们录入的顺序遍历输出。

到此这篇关于Java集合中的Set之LinkedHashSet详解的文章就介绍到这了,更多相关Java中的LinkedHashSet内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springCloud集成nacos启动时报错原因排查

    springCloud集成nacos启动时报错原因排查

    这篇文章主要介绍了springCloud集成nacos启动时报错原因排查,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Mybatis的特点及优点

    Mybatis的特点及优点

    Mybatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。mybatis有哪些特点和优点呢?通过本文一起学习吧
    2016-12-12
  • Java并发编程-volatile可见性详解

    Java并发编程-volatile可见性详解

    这篇文章主要介绍了Java并发编程-volatile可见性详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot下载文件的实现及速度对比

    SpringBoot下载文件的实现及速度对比

    这篇文章主要介绍了SpringBoot下载文件的实现及速度对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 使用Feign调用第三方http接口

    使用Feign调用第三方http接口

    这篇文章主要介绍了使用Feign调用第三方http接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • java连接Oracle数据库的方法解析

    java连接Oracle数据库的方法解析

    本文主要对java连接Oracle数据库方法进行步骤解析,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • gson ajax 数字精度丢失问题的解决方法

    gson ajax 数字精度丢失问题的解决方法

    下面小编就为大家带来一篇gson ajax 数字精度丢失问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Dubbo+zookeeper搭配分布式服务的过程详解

    Dubbo+zookeeper搭配分布式服务的过程详解

    Dubbo作为分布式架构比较后的框架,同时也是比较容易入手的框架,适合作为分布式的入手框架,下面是简单的搭建过程,对Dubbo+zookeeper分布式服务搭建过程感兴趣的朋友一起看看吧
    2022-04-04
  • Spring AOP底层机制之代理模式

    Spring AOP底层机制之代理模式

    如何实现在不修改源码的基础上实现代码功能的增强呢?spring为我们提供了代理模式。所谓的代理模式通俗来说就是一个中介,它给某一个对象提供一个代理对象,并由代理对象控制原对象的引用,从而实现在不修改源码的基础上实现代码功能的增强
    2022-08-08
  • JAVA中的FileWriter流解析

    JAVA中的FileWriter流解析

    这篇文章主要介绍了JAVA中的FileWriter流解析,FileWriter类提供了多种写入字符的方法,包括写入单个字符、写入字符数组和写入字符串等,它还提供了一些其他的方法,如刷新缓冲区、关闭文件等,需要的朋友可以参考下
    2023-10-10

最新评论