LinkedHashSet源码阅读理解

news2024/12/24 8:55:12

概述

1、底层:HashSet + LinkedHashMap

2、创建节点时将节点插入链表,因此有序

3、线程不安全

源码理解

demo:

public class LinkedHashSetDemo {

    public static void main(String[] args) {
           test();
    }

    public static void test(){
        LinkedHashSet<Object> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add("");
        linkedHashSet.remove("");
    }

}

1、先看下创建其对象的时候做了些什么

image.png
调用其父类的构造方法,跟进去…

image.png
来到HashSet的有参构造方法,其中initialCapacity = 16、loadFactor = 0.75f、dummy = true,内部使用前两个参数构建了一个LinkedHashMap对象作为全局变量,可以看到这个dummy参数没有使用到;

image.png

因此无参创建LinkedHashSet对象的时候实际上就是初始化了HashSet内一个LinkedHashMap的全局变量,且初始容量为16,负载因子为0.75;

2、LinkedHashSet的add()方法:

image.png
实际上调用的是HashSet的add方法,

image.png
这个map类型前面说到了是LinkedHashMap,看下PRESENT是什么:

image.png
一个Object对象;

至此,LinkedHashSet的add方法其实就是调用将数据存储到一个LinkedHashMap集合中;
那么继续来看下LinkedHashMap中是怎么存储数据的,为什么让其有序;

3、LinkedHashMap的put方法:

image.png
发现LinkedHashMap内其实是没有put方法的,那么也就是说这个put方法是其父类的,而LinkedHashMap的父类就是HashMap:

image.png

那再回顾一次HashMap的put方法:

image.png

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
               boolean evict) {
    Node<K,V>[] tab; Node<K,V> p; int n, i;
    if ((tab = table) == null || (n = tab.length) == 0)
        n = (tab = resize()).length;
     // 寻址
    if ((p = tab[i = (n - 1) & hash]) == null)
        // 构建节点插入数组
        // LinkedHashMap重写了构建节点的方法,此处及以下调用的都是LinkedHashMap中的newNode
        tab[i] = newNode(hash, key, value, null);
    else {
        Node<K,V> e; K k;
        if (p.hash == hash &&
            ((k = p.key) == key || (key != null && key.equals(k))))
            e = p;
        else if (p instanceof TreeNode)
            e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
        else {
            for (int binCount = 0; ; ++binCount) {
                if ((e = p.next) == null) {
                    p.next = newNode(hash, key, value, null);
                    if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                        treeifyBin(tab, hash);
                    break;
                }
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k))))
                    break;
                p = e;
            }
        }
        if (e != null) { // existing mapping for key
            V oldValue = e.value;
            if (!onlyIfAbsent || oldValue == null)
                e.value = value;
            afterNodeAccess(e);
            return oldValue;
        }
    }
    ++modCount;
    if (++size > threshold)
        resize();
    afterNodeInsertion(evict);
    return null;
}

接着看LinkedHashMap中重写的newNode()方法

image.png
第258行就是将节点插入链表,跟进linkNodeLast()

image.png

可见,内部是一个很简单的链表插入,这也就是LinkedHashMap内部维护的一个链表;

总结:LinkedHashSet底层其实就是调用的HashSet + LinkedHashMap,以保证数据的唯一和插入有序;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CDMP认证考试考前你需要了解的那些事

对国内的数据从业人员来说&#xff0c;CDMP算比较新的考试&#xff0c;目前相关介绍很少&#xff0c;小编整理了CDMP考试先关的一些内容&#xff0c;希望对正在考虑考取CDMP认证的你有所帮助&#xff01;CDMP认证有几个等级&#xff1f;4个。A级&#xff08;基础级&#xff09;…

为什么Google优化排名前期要做长尾关键词?谷歌seo怎么做?

本文主要分享关于谷歌长尾词对于外贸网站获取流量和排名的重要性。 本文由光算创作&#xff0c;有可能会被修改和剽窃&#xff0c;我们佛系对待这种行为吧。 Google优化排名是指在Google 搜索结果中&#xff0c;使外贸站的排名更高。 长尾关键词是指长度较长的&#xff0c;不…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第2天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有65天

&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6; 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&a…

【计算机网络】Linux下路由配置总结

文章目录路由的基础知识Linux内核路由表使用route -n命令查看Linux内核路由表三种路由类型说明(Flags)配置路由route的命令设置包转发静态路由配置参考路由的基础知识 1&#xff09;路由概念 路由&#xff1a; 跨越从源主机到目标主机的一个互联网络来转发数据包的过程路由器…

多线程代码案例之单例模式

目录 单例模式 饿汉模式 懒汉模式 问题一 问题二 问题三 单例模式 单例模式&#xff0c;是设计模式的一种。在有些特定场景中&#xff0c;有的特定的类&#xff0c;只能创建出一个实例&#xff0c;不应该创建多个实例。单例模式就可以保证这样的需求。例如JDBC中的Data…

OpenMMLab AI实战营笔记前两次课

文章目录1计算机视觉算法基础与 OpenMMLabCV引入OpenMMLab基础知识&#xff1a;2 计算机视觉之图像分类算法基础传统方法--设计图像特征AlexNet VGG 等神经网络搜索&#xff08;2016&#xff09;Vision/Swin Transformer轻量化卷积神经网络注意力机制 Attention Mechanism模型学…

文档存储Elasticsearch系列--3分布式存储和搜索过程

前言&#xff1a;ES 作为分布式文档的存储&#xff0c;它的存储过程是怎样的&#xff0c;它的分布式检索过程又是怎样的&#xff1b; 1 分布式存储过程&#xff1a; 为了说明目的, 我们 假设有一个集群由三个节点组成。 它包含一个叫 blogs 的索引&#xff0c;有两个主分片&a…

linux查看/设置某个进程运行的CPU核

目录 1.ps -eF 2.top命令 3.pidstat命令 4.使用taskset指令 5.使用taskset指定进程运行在CPU核 1.ps -eF #查看fwd进程运行在哪个cpu核上 [rootCENTOS57 rpm]# ps -eF | grep fwd 2.top命令 (1)top (2)按f键可以选择下面配置选项 P Last Used Cpu (SMP) (3)Es…

【深度学习】YOLO系列(v1-v3+tinyv3)解析

YOLOv1 正负样本选取 如果目标的中心落在cell中,那么这个cell就负责预测这个类别。 由于每个cell预测两个bbox,那么选择与GT IOU大的bbox来预测这个目标,也就是这一个框的 1 i j o b j = 1 , 1 i j n o b j

通过Python的pptx库操作ppt-替换文本和图片-批量生成任意自定义图片

通过Python的pptx库操作ppt-替换文本和图片-批量生成任意自定义图片 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、前言 这是一个全部的脚本&#xff0c;我们知道&#xff0c;…

阿里巴巴最全Java、架构师、大数据、算法PPT技术栈图册

我只截图不说话&#xff0c;PPT大全&#xff0c;氛围研发篇、算法篇、大数据、Java后端架构&#xff01;除了大家熟悉的交易、支付场景外&#xff0c;支撑起阿里双十一交易1682亿元的“超级工程”其实包括以下但不限于客服、搜索、推荐、广告、库存、物流、云计算等。 Java核心…

第二章 Linux系统安装

第一节 安装计划 基本思路是使用VMWare这样的虚拟机软件创建一个“虚拟计算机”&#xff0c;在虚拟机上安装Linux系统。 安装vm软件通过vm软件来创建一个虚拟机空间通过vm软件来在创建好的虚拟空间上&#xff0c;安装我们的Centos操作系统使用Centos 第二节 vmware下载安装 和…

python-实现保留3位有效数字(四舍六入五成双规则)

项目场景&#xff1a; 实现保留3位有效数字&#xff08;四舍六入五成双规则&#xff09; 问题描述 输入&#xff1a;输出&#xff1a; 1234 123412 12.04 4.000.2 0.2000.32 0.3201.3 1.301.235 1.241.245 1.241.2451 1.25示例分析&#xff1a; 解决代码&#xff1a; from de…

jvm启动流程以及自定义加载器

类加载运行过程&#xff0c;当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM。public class Math {public static final int initData 666;public static final User user new User();public int compute() {// 一个方法对应…

【C++】对象与类

【C】对象与类 文章目录【C】对象与类1、定义1.1 对象的定义1.2 类的定义2、对象与类的创建2.1 类的创建2.2 对象的创建3、封装3.1 访问限定符3.2 对封装的解释4、类的实例化5、类、对象大小6、this指针6.1 this指针概念6.2 this指针特点1、定义 1.1 对象的定义 现实世界对对…

写哪个IB科目的EE最易得A?

综合了IB论坛上学生的建议&#xff0c;根据IB毕业生们的看法&#xff1a; E同学&#xff1a;选择你感兴趣的科目写EE。 R同学&#xff1a;我推荐写IB英语EE&#xff0c;在我看来&#xff0c;英语很容易找到你感兴趣的内容&#xff0c;因为英语 EE 适用于诸多的不同主题。我觉得…

录制PPT课件哪个录屏软件好?这3款值得收藏

使用PPT课件进行教学&#xff0c;不仅可以让抽象的知识具体化&#xff0c;还可以让课堂变得更加生动有趣。在制作视频课程时&#xff0c;需要对PPT课件进行录制&#xff0c;那你知道录制PPT课件哪个录屏软件好吗&#xff1f;今天小编就给大家介绍3款值得收藏的录屏软件&#xf…

为什么GIF文件是图像文件而不是视频文件?(GIF文件格式详解)

今天整理硬盘的时候想到一个问题&#xff1a;GIF 是放在静态图像文件里还是视频文件里&#xff1f; 因为放视频里吧&#xff0c;GIF 的分类是静态图像&#xff0c;而且由图像组成&#xff1b;放图像里吧&#xff0c;它又会动。 然后我就开始想&#xff1a;GIF 会动但为什么被归…

分享113个图片切换JS特效,总有一款适合您

分享113个图片切换JS特效&#xff0c;总有一款适合您 113个图片切换JS特效下载链接&#xff1a;https://pan.baidu.com/s/1NNSP-DMf3n0PeNbdNd8jEg?pwdsfwr 提取码&#xff1a;sfwr Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj jQuery中间…

Java基础学习笔记(十九)—— 多线程

多线程1 多线程相关概念2 多线程的实现方式2.1 继承Thread类2.2 实现Runnable接口2.3 实现Callable接口3 线程休眠4 线程优先级5 守护线程6 线程同步6.1 案例引入6.2 同步代码块6.3 同步方法6.4 Lock锁6.5 死锁1 多线程相关概念 并行与并发&#xff1a; 并行&#xff1a;在同…