java linkhashset_java中集合怎么定义

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

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

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

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

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

构造一个空连接散列集合

java linkhashset_java中集合怎么定义

java linkhashset_java中集合怎么定义

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

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

java linkhashset_java中集合怎么定义

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

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

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

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

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

java linkhashset_java中集合怎么定义

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

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

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

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

java linkhashset_java中集合怎么定义

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

java linkhashset_java中集合怎么定义

java linkhashset_java中集合怎么定义

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

java linkhashset_java中集合怎么定义

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

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android MediaPlayer Error/Info Code

    Android MediaPlayer Error/Info Code

    2022年2月3日
    41
  • java的serializable接口_javacloneable接口

    java的serializable接口_javacloneable接口Cloneable接口clone:它允许在堆中克隆出一块和原对象一样的对象,并将这个对象的地址赋予新的引用。Java中一个类要实现clone功能必须实现Cloneable接口,否则在调用clone()时会报CloneNotSupportedException异常。Java中所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clon

    2022年10月14日
    0
  • django模型数据类型_盒子模型边框属性

    django模型数据类型_盒子模型边框属性模型中常用字段字段说明AutoField一般不需要使用这个类型,自增长类型,数据表的字段类型为整数,长度为11位BigAutoField自增长类型,数据表的字段类型为bigint,长度为2

    2022年7月30日
    3
  • JavaScript(1)高阶函数filter、map、reduce

    JavaScript(1)高阶函数filter、map、reduce前言需求:有这样一个数组[10,20,110,200,60,30,40]1.筛选出数组中小于100的元素2.将筛选出的每个元素的值x23.完成第2步之后,将数组中的所有元素加起来

    2022年8月7日
    4
  • phpstorm2020激活码【在线破解激活】

    phpstorm2020激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    113
  • maven环境变量配置详细步骤(win10)

    maven环境变量配置详细步骤(win10)一、前言最近更新了系统,maven也想了想也需要装个新版本了,去下载了新版本,记录下maven的安装配置,初学小伙伴可以看看。安装前确认已经安装好了JDK,没有安装或下载的小伙伴可以参考我另外一篇文章原创jdk1.8下载与安装教程(win10),其它版本类似。安文件大家可以自己去官网下载,也可以直接在下面到我的网盘下载,官网向来下载速度都比较慢。目前版本是3.6.3版本,有新版本我也…

    2022年7月24日
    10

发表回复

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

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