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

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

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

Set set = new LinkedHashSet<>();

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

构造一个空连接散列集合

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

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

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

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

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

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

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

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

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

我们定义一个LinkedHashSet---LinkedHashSet set = new LinkedHashSet<>();

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

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

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

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

整个过程就是LinkedHashSet在容器插入数据的过程。此过程主要由LinkedHashSet.class中重写超类的两个addEntry和createEntry 实现双向链表的结构。保证数据已我们录入的顺序遍历输出。

————————————————

版权声明:本文为CSDN博主「X-TIE」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/zhaojie181711/article/details/80510129

java linkedhashset_java之LinkedHashSet相关推荐

  1. Java Review - LinkedHashMap LinkedHashSet 源码解读

    文章目录 Pre 概述 数据结构 类继承关系 构造函数 方法 get() put() remove() LinkedHashSet 使用案例 - FIFO策略缓存 Pre Java Review - ...

  2. Java 中removelinked_Java LinkedHashSet remove()用法及代码示例

    Java.util.LinkedHashSet.remove(Object O)方法用于从LinkedHashSet中删除特定元素. 用法: LinkedHashSet.remove(Object O ...

  3. Java集合之LinkedHashSet源码分析

    概述 LinkedHashSet与HashSet类似, 不同的是LinkedHashSet底层使用LinkedHashMap维护元素插入的顺序. LinkedHashSet继承自HashSet, 只是 ...

  4. Java中的LinkedHashSet

    1. LinkedHashSet类 (1. LinkedHashSet Class) LinkedHashSet class is the hash table and linked list imp ...

  5. 【Java集合系列四】HashSet和LinkedHashSet解析

    2017-07-29 16:58:13 一.简介 1.Set概念 Set可以理解为集合,非常类似数据概念中的集合,集合三大特征:1.确定性:2.互异性:3.无序性,因此Set实现类也有类似的特征. 2 ...

  6. Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap

    Java LinkedHashMap和HashMap有什么区别和联系?为什么LinkedHashMap会有着更快的迭代速度?LinkedHashSet跟LinkedHashMap有着怎样的内在联系?本 ...

  7. linkedhashset_Java LinkedHashSet clear()方法与示例

    linkedhashset LinkedHashSet类的clear()方法 (LinkedHashSet Class clear() method) clear() method is availa ...

  8. linkedhashset_Java LinkedHashSet contains()方法与示例

    linkedhashset LinkedHashSet类contains()方法 (LinkedHashSet Class contains() method) contains() method i ...

  9. Java Threads 多线程10分钟参考手册

    1         同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通常把这 ...

最新文章

  1. 剑指offer:滑动窗口最大值
  2. 成功解决ValueError: Shape of passed values is (33, 1), indices imply (33, 2)
  3. python金融量化风险_【手把手教你】Python量化策略风险指标
  4. mysql rpm 安装6_CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍
  5. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)...
  6. AcWing 853. 有边数限制的最短路(bellman的k边限制最短路)
  7. python类修饰器_Python 中使用类修饰器修饰类方法如何处理 self?
  8. 翻译spring4.2官方文档(3)
  9. 陈纪修 数学分析,上下册
  10. Python 源码剖析 目录
  11. 黑马python培训视频网盘下载
  12. 完了!生产事故!几百万消息在消息队列里积压了几个小时!
  13. FTP文件传输协议与部署,包括Linux系统、Windows系统和H3C路由交换设备部署
  14. BSV 上的 zk-SNARKs
  15. 酒店预订系统源码c语言,HotelManage - 源码下载|系统编程|源代码 - 源码中国
  16. java 面向对象P60
  17. android 项目练习:自己的词典app——生词本(二)
  18. java编程atm取款机实验报告_ATM自动取款机JAVA程序
  19. docker 安装Subversion Edge
  20. 软件测试文档结课论文,现代检测技术结课论文.doc

热门文章

  1. Linux下安装并使用MySQL数据库
  2. AUTOSAR从入门到精通100讲(十五)-AURIX TC3xx MCAL中Link文件解析以及代码变量定位方法详解
  3. 神经网络最常用的10个激活函数,一文详解数学原理及优缺点
  4. 用python验证猜想之类的例子_python练手好例子:验证哥德巴赫猜想
  5. win7 网络端口怎么设置_教你win7如何设置网络共享文件夹
  6. click点击后鼠标移去就失效怎么实现_鼠标右键失灵怎么办,你知道原因吗?
  7. axios队列 vue_vue axios全攻略
  8. android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)
  9. 《React Native 精解与实战》书籍连载「React Native 网络请求与列表绑定」
  10. JS中的间歇(周期)调用setInterval()与超时(延迟)调用setTimeout()相关总结