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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java concurrency之互斥锁_动力节点Java学院整理

    Java concurrency之互斥锁_动力节点Java学院整理

    本文通过示例代码给大家介绍了Java concurrency之互斥锁的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-06-06
  • idea gradle项目复制依赖小技巧(推荐)

    idea gradle项目复制依赖小技巧(推荐)

    这篇文章主要介绍了idea gradle项目复制依赖小技巧,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • SpringBoot-RestTemplate如何实现调用第三方API

    SpringBoot-RestTemplate如何实现调用第三方API

    这篇文章主要介绍了SpringBoot-RestTemplate实现调用第三方API的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java8中如何通过方法引用获取属性名详解

    Java8中如何通过方法引用获取属性名详解

    这篇文章主要给大家介绍了关于Java8中如何通过方法引用获取属性名的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    今天小编就为大家分享一篇关于SpringBoot与Quartz集成实现分布式定时任务集群的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java编程之继承问题代码示例

    Java编程之继承问题代码示例

    这篇文章主要介绍了Java编程之继承问题代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java实现将容器 Map中的内容保存到数组

    Java实现将容器 Map中的内容保存到数组

    这篇文章主要介绍了Java实现将容器 Map中的内容保存到数组,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 通过Java连接SQL Server数据库的超详细操作流程

    通过Java连接SQL Server数据库的超详细操作流程

    java相对于其他语言(例如c,c++等)连接数据库要方便得多,那么如何连接呢?下面这篇文章主要给大家介绍了关于通过Java连接SQL Server数据库的超详细操作流程,需要的朋友可以参考下
    2023-03-03
  • SpringBoot使用Shiro实现动态加载权限详解流程

    SpringBoot使用Shiro实现动态加载权限详解流程

    本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 、 按钮 、uri 权限后,后端动态分配权限,用户无需在页面重新登录才能获取最新权限,一切权限动态加载,灵活配置
    2022-07-07
  • 如何用java给文件加密的简单实现

    如何用java给文件加密的简单实现

    文件加密,简单来说就是把文件读取出来,把读取出来的字节码数组进行遍历,把每一个码值和一个秘钥(随便一个数)进行异或运算,将运算后的结果全部写入到文件里,这篇文章主要介绍了如何用java给文件加密的简单实现,需要的朋友可以参考下
    2023-12-12

最新评论