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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mybatis笔记(3)

    Mybatis笔记(3)

    2021年11月11日
    45
  • Linux 搭建 Kafka教程[通俗易懂]

    Linux 搭建 Kafka教程[通俗易懂]把kafka解压到linux去配置文件中配置环境配置kafka文件内容进入kafka/config目录修改server.properties文件修改broker.id=id里面的数值不可以重复同时添加主机的ip和端口host.name=192.168.10.101listeners=PLAINTEXT://192.168.10.101:9092在下面找到log.dirs修改日志的地址修改为我们三台机器ip地址zookeeper.connect=localhost:21

    2022年10月16日
    5
  • mysql修复表的三个方法

    mysql修复表的三个方法

    2022年2月10日
    125
  • a4如何打印双面小册子_a4如何打印双面小册子[通俗易懂]

    a4如何打印双面小册子_a4如何打印双面小册子[通俗易懂]展开全部1、在Word中打开一篇文档,点击“文件”——“打印”菜单项,准备开始打印工作。2、弹出“32313133353236313431303231363533e4b893e5b19e31333433623230打印”对话框,在“打印机”名称框的左侧,点击“属性”按钮,点击此按钮,开始设置小册子打印。3、弹出打印机属性对话框,在“双面打印”部分,点击下拉菜单,选择“双面打印,短边“装订。(目…

    2025年9月23日
    5
  • FPGA与CPLD的区别

    FPGA与CPLD的区别CPLD和FPGA两者的区别CPLD和FPGA都是我们经常会用到的器件。有的说有配置芯片的是FPGA,没有的是CPLD;有的说逻辑资源多的是FPGA,少的是CPLD;有的直接就不做区分,把他们都叫做FPGA。那么两者到底有什么区别呢?下面我们就以Altera公司的CPLD和FPGA为例来说说两者的区别。首先我们看一下CPLD的芯片结构,搞清楚CPLD是由哪几部分组成的。下图是MAX系…

    2022年5月4日
    47
  • FastCGI协议内容「建议收藏」

    FastCGI协议内容「建议收藏」cgi或者fastcgi协议的定义:Webserver(web服务器软件如nginxhttpd等)与真实后台处理请求的程序之间通信的一种约定规范找了一篇文章把fastcgi协议讲得比较清楚,记录一下。原文地址:https://www.cnblogs.com/itbsl/p/9828776.html#%E5%86%8D%E7%9C%8B-fastcgi-%E5%8D…

    2022年7月11日
    17

发表回复

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

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