Java中LinkedHashSet的底层机制详解

 更新时间:2023年09月05日 09:24:26   作者:风过无痕2018  
这篇文章主要介绍了Java中LinkedHashSet的底层机制解读,   LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现,此实现与HashSet的不同之处在于,后者维护着一个运行于所有条目的双重链接列表,需要的朋友可以参考下

LinkedHashSet的底层机制

  • LinkedHashSet是HashSet的子类
  • LinkedHashSet底层是一个 LinkedHashMap,底层维护了一个数组+双向链表
  • LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序, 这使得元素看起来是以插入顺序保存的。(有序)
  • LinkedHashSet 不允许添重复元素

1.在LinkedHastSet中维护了一个hash表和双向链表(LinkedHashSet有head 和tail )

2. 每一个节点有pre和next属性,这样可以形成双向链表

3. 在添加一个元素时,先求hash值,在求索引.确定该元素在hashtable的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加[原则和hashset一样])

tail.next = newElement //简单指定
newElement.pre = tail
tail = newEelment;

4. 这样的话,我们遍历LinkedHashSet 也能确保插入顺序和遍历顺序一致

节点之间的连接示意图

在这里插入图片描述

解读

  • LinkedHashSet 加入顺序和取出元素/数据的顺序一致
  • LinkedHashSet 底层维护的是一个LinkedHashMap(是HashMap的子类)

在这里插入图片描述

  • LinkedHashSet 底层结构 (数组table+双向链表)
  • 添加第一次时,直接将 数组table 扩容到 16 ,存放的结点类型是 LinkedHashMap$Entry

在这里插入图片描述

  • 数组是 HashMap$ Node[] 存放的元素/数据是 LinkedHashMap$Entry类型

 Entry的结构

     //继承关系是在LinkedHashMap的内部类完成.
     static class Entry<K,V> extends HashMap.Node<K,V> {
         Entry<K,V> before, after;
         Entry(int hash, K key, V value, Node<K,V> next) {
             super(hash, key, value, next);
         }
     }  ```

加入时链表的连接情况

在这里插入图片描述

在这里插入图片描述

此时head和tail的指向

在这里插入图片描述

最后before和after之间的关系

在这里插入图片描述

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

相关文章

  • SpringBoot使用邮箱发送验证码实现注册功能

    SpringBoot使用邮箱发送验证码实现注册功能

    这篇文章主要为大家详细介绍了SpringBoot使用邮箱发送验证码实现注册功能实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 分布式事务CAP两阶段提交及三阶段提交详解

    分布式事务CAP两阶段提交及三阶段提交详解

    这篇文章主要为大家介绍了分布式事务CAP、两阶段提交及三阶段提交的内容详解有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-01-01
  • springboot项目组引入JMeter的实现步骤

    springboot项目组引入JMeter的实现步骤

    本文主要介绍了springboot项目组引入JMeter的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 详解Java中ExceptionInInitializer错误的解决方法

    详解Java中ExceptionInInitializer错误的解决方法

    ExceptionInInitializerError 是 Java 中的未经检查的异常,它是 Error 类的子类, 它属于运行时异常的类别,下面我们就来看看它的具体解决方法吧
    2024-02-02
  • Java高效读取Excel表格数据的详细教程

    Java高效读取Excel表格数据的详细教程

    在日常的软件开发和数据处理工作中,我们经常需要与各种格式的数据文件打交道,其中Excel表格因其直观性和广泛应用而占据重要地位,手动处理Excel数据不仅耗时耗力,而且极易出错,尤其是在面对海量数据时,所以本文介绍了Java高效读取Excel表格数据的详细教程
    2025-08-08
  • .NET到Java迁移的完整指南

    .NET到Java迁移的完整指南

    在技术领域,转型通常意味着漫长的学习和阵痛期,然而,对于经验丰富的.NET开发者而言,转向Java并非从零开始,本指南摒弃泛泛而谈,聚焦于利用你已有的.NET思维模式和工程经验,通过一条高度压缩、直击要害的路径,将你的技能无缝、快速地映射到Java宇宙
    2025-12-12
  • 详解Spring Cloud Zuul网关修改为短连接方法

    详解Spring Cloud Zuul网关修改为短连接方法

    本文主要介绍了详解Spring Cloud Zuul网关修改为短连接方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Spring Boot 配置文件(application.yml、application-dev.yml、application-test.yml)

    Spring Boot 配置文件(application.yml、application-dev.y

    本文主要介绍了Spring Boot 配置文件,主要包含application.yml、application-dev.yml、application-test.yml,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Java 如何接收kernel传过来的数组(推荐)

    Java 如何接收kernel传过来的数组(推荐)

    这篇文章主要介绍了Java 如何接收kernel传过来的数组,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08
  • springboot2启动时执行,初始化(或定时任务)servletContext问题

    springboot2启动时执行,初始化(或定时任务)servletContext问题

    这篇文章主要介绍了springboot2启动时执行,初始化(或定时任务)servletContext问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论