HashSet、HashMap、LinkedHashMap、HashTable、ConcurrentHashMap源码阅读笔记

news2024/11/19 19:29:58

目录

    • 一、HashSet
    • 二、HashMap
    • 三、LinkedHashMap
    • 四、HashTable
    • 五、ConcurrentHashMap

一、HashSet

首先,让我们先从最简单的开始,总的来说,hashSet可以说是建立在hashMap上的变种应用。
通过阅读hashSet的源码我们可以得出以下结论:

1. hashSet的add方法,是巧妙运用了hashMap的key值不可重复的特性;
2. 由于hashMap的可以是可以为null的,所以,hashSet的值支持为null;
3. hashSet不是线程安全的;
4. hashSet的clone方法,是浅复制,即当原set内的元素值改变时,copy的set里的值也改变;
5. 当不指定容量时,hashSet的默认容量时16,负载因子是0.75;
6. 由于hashSet的iterator(迭代器)是fail-fast模式,因此在interator操作时,hashSet发生变化,会导致异常抛出: ConcurrentModificationException;

在这里插入图片描述在这里插入图片描述在这里插入图片描述

二、HashMap

由于hashMap的源码比较长,我们就不在这里贴出了,通过阅读hashSet的源码我们可以得出以下结论:
**1. 默认容量是16,最大容量是2^30,默认负载因子0.75,自定义容量时必须是2的幂级;

  1. hashMap也不是线程安全的,推荐单线程内使用;
  2. 触发结构“树化”的最小容量是64,当一个支链上的值大于8个时,触发树化,小于6个时退缩成链表;**
    在这里插入图片描述
    4. 关于时间复杂度,如果桶里面没有元素,那么直接将元素插入/或者直接返回未查找到,时间复杂度就是O(1),如果里面有元素,那么就沿着链表进行遍历,时间复杂度就是O(n),链表越短时间复杂度越低,如果是红黑树的话那就是O(logn)。所以平均复杂度很难说,只能说在最优的情况下是O(1)
    5. 单向链表形式存储,(node.next指向下一个节点值);
    在这里插入图片描述

三、LinkedHashMap

linkedHashMap是jdk1.4出现的,是java 集合框架的一员;是hashMap的子类。通过源码阅读,可以获取一下信息:
1. 其结构是双向链表,对hashMap.node做了拓展,通过before和after记录相邻数据;
3. 用head和tail记录最早的和最新的数据;
4. 其默认容量,负载因子等,同hashMap;
5. 多了个accessOrder变量,用于遍历时的输出顺序,默认false,即以插入顺序遍历;
6. 由于linkedHashMap是hashMap的子类,它的树化逻辑同hashMap;
7. 它不是线程安全的;

在这里插入图片描述

四、HashTable

阅读hashTable的源码,可知:

  1. 它是线程安全的,是由于其对外方法加了synchronized修饰词;
  2. 它的默认容量是11,加载因子是0.75;当初始容量小于0时,抛
    IllegalArgumentException;
  3. 它是Dictionary的子类,这一点与hashMap不同,hashMap继承AbstractMap;
  4. 最大容量2^31-1-8;
  5. key和value都不允许为null,否则抛NullPointerException;
  6. 当table中key已经存在,会第二次put的value值放入,并返回第一次的value值;
  7. clone操作是浅copy,不对keys和values进行复制,且是个十分耗时的操作;
  8. hashTable里存储的是entry<K,V>数组,且是单向链表形式;
    在这里插入图片描述在这里插入图片描述

五、ConcurrentHashMap

ConcurrentHashMap是针对hashMap的安全性做的设计和拓展,
因此它具有hashMap的很多特性,比如容量、负载因子、树化等,除此之外,为了保证其线程安全性和拓展性能,ConcurrentHashMap在存储结构上也做了一些改造,通过阅读源码,可以得到以下几点:

  1. 我们常说,ConcurrentHashMap性能优于hashTable,是因为ConcurrentHashMap的锁是建立在分段锁上的,它以每个链上的第一个值为锁对象进行加锁;
  2. key和value也是以内部类node节点存储;
  3. 存储结构做了个比较大的优化,数组+链表+红黑树;
  4. key和value都不允许为空;
  5. 在调用putVal时,空链不会加锁,利用cas尝试写入,利用自旋保证写入;
    在这里插入图片描述
/* ---------------- Fields -------------- */

    /**
     * The array of bins. Lazily initialized upon first insertion.
     * Size is always a power of two. Accessed directly by iterators.
     */
    transient volatile Node<K,V>[] table;

    /**
     * The next table to use; non-null only while resizing.
     */
    private transient volatile Node<K,V>[] nextTable;

    /**
     * Base counter value, used mainly when there is no contention,
     * but also as a fallback during table initialization
     * races. Updated via CAS.
     */
    private transient volatile long baseCount;

    /**
     * Table initialization and resizing control.  When negative, the
     * table is being initialized or resized: -1 for initialization,
     * else -(1 + the number of active resizing threads).  Otherwise,
     * when table is null, holds the initial table size to use upon
     * creation, or 0 for default. After initialization, holds the
     * next element count value upon which to resize the table.
     */
    private transient volatile int sizeCtl;

    /**
     * The next table index (plus one) to split while resizing.
     */
    private transient volatile int transferIndex;

    /**
     * Spinlock (locked via CAS) used when resizing and/or creating CounterCells.
     */
    private transient volatile int cellsBusy;

    /**
     * Table of counter cells. When non-null, size is a power of 2.
     */
    private transient volatile CounterCell[] counterCells;

    // views
    private transient KeySetView<K,V> keySet;
    private transient ValuesView<K,V> values;
    private transient EntrySetView<K,V> entrySet;

在这里插入图片描述

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

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

相关文章

1556_AURIX_TC275_复位系统控制单元

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这是上一部分没有看完的CCU的核心寄存器的存储映射信息&#xff0c;只是一个汇总&#xff0c;没有需要着重处理的分析点。 复位控制单元涉及到的几个大功能&#xff1a;基本复位、外部复位…

订单服务-----遇到的问题及解决方案

订单服务的问题及解决方案 问题1&#xff1a;Feign远程调用时丢失请求头 出现这个Feign远程调用时丢失请求头的问题是因为Feign在远程调用的时候会创建一个新的请求&#xff0c;但是这个新的请求里啥都没有&#xff0c;没有cookie值&#xff0c;而这个cookie值里有成功登录后的…

投稿MDPI旗下期刊的一些心得和记录

投稿历程&#xff1a; 09.02 提交初稿 under review 09.05 分配助理编辑&#xff0c;论文送审 10.13 第一轮审稿完毕&#xff0c;大修&#xff0c;两个审稿人 Pending Major Revisions 10.16 语言问题需要润色&#xff0c;使用MDPI润色机构 10.19 重新提交修改稿 Resubmitt…

【Axure教程】中继器版穿梭表格

表格是我们系统中常用的组件&#xff0c;穿梭表格就是使用直观方式在两个表格中移动数据&#xff0c;实现数据的流动。今天作者就教大家如何在Axure里用中继器制作出表格穿梭的效果&#xff1a; 1、选中效果&#xff1a;鼠标点击表格中所在的行&#xff0c;可以选中该行数据 …

【Vue 快速入门系列】组件的基本使用

文章目录一、组件的概念二、非单文件组件三、单文件组件1.main.js2.App.vue3.school.vue4.student.vue5.index.html四、内容补充及原理剖析1.组件命名注意点2.组件嵌套内置关系3.重要的内置关系一、组件的概念 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之…

Java日期与时间

时间与日期DateSimpleDateFormatCalendarJDK8新增日期类概述LocalDate、LocalTime、LocalDateTimeInstant时间戳DateTimeFormatterDuration/PeriodChronoUnitDate Date类概述 Date类的对象在Java中代表的是当前所在系统的此刻日期时间。 Date的构造器 Date的常用方法 Date类…

2022最新 MySQL事务面试题合集

小熊学Java网站&#xff1a;https://javaxiaobear.gitee.io/&#xff0c;每周持续更新干货&#xff0c;建议收藏&#xff01; 61、什么是数据库事务&#xff1f;事务的特性是什么&#xff1f; 事务&#xff1a; 是数据库操作的最小工作单元&#xff0c;是作为单个逻辑工作单元执…

微服务框架 SpringCloud微服务架构 25 黑马旅游案例 25.2 条件过滤

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构25 黑马旅游案例25.2 条件过滤25.2.1 直接开干25 黑马旅游案例 25.2 条件…

怎么把磁盘合并成一个?两个硬盘分区合并,如何硬盘分区合并

怎么把磁盘合并成一个&#xff1f;有时候电脑分区有点多&#xff0c;想要给硬盘的分区合并不知道如何操作&#xff0c;如何在不影响系统正常使用的情况下合并分区呢&#xff1f;本篇文章将详细解答这个问题。 之前有个客户提出这样一个问题&#xff0c;那就是在安装完windows10…

【CSS3】text-shadow/text-overflow,边框图片,透明度,小米轮播图子菜单另一种实现

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录text-shadowtext-overflow边框图片border-image-sourceborder-image-sliceborder-image-widthbor…

数据智仓功能介绍(一)

数据智仓英文名称为Smart Data Warehouse&#xff0c;可简写为SDW。数据智仓是JVS整体企业数字化解决方案的核心能力&#xff0c;与JVS的低代码开发套件平级。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供基于数据的决策支持&#xff08;Decision Supp…

世界杯论文

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;愿…

cockpit管理控制台-尚文网络xUP楠哥

~~全文共1499字&#xff0c;阅读需约5分钟。 进Q群11372462&#xff0c;领取专属报名福利&#xff0c;包含云计算学习路线图代表性实战训练大厂云计算面试题资料! Cockpit 是红帽开发的web方式的服务管理工具&#xff0c;从Linux7版本开始就有了&#xff0c;其优点可以管理很多…

密码学-2-RSA签名验签方案

密码学-1-数字签名体制密码学-2-RSA签名验签方案 目录 1 签名验签 2 RSA签名算法 2.1 RSA生成签名 2.2 RSA验证签名 2.3 RSA参数的选定 2.3.1 公私钥 2.3.2 E&#xff0c;N&#xff0c;D 2.4 RSA签名应用场景 2.4.1 签名 2.4.2 验签 1 签名验签 重温上节所述的签名流…

给tabbar 中间位置添加一个自定义按钮 (Swift 代码)

1.创建一个继承自UITabbarViewController的控制器&#xff0c;在这个控制器中写如下代码 override func viewDidLoad() {super.viewDidLoad()//这个按钮就是中间添加的按钮let middleBtn UIButton(type: .custom)middleBtn.frame CGRect(x: kScreenWidth/5*2 , y: -10, widt…

如何提高外贸询单转化率

如何提高外贸询盘的转化率&#xff1f;米贸搜整理了以下方法&#xff0c;希望对你有所帮助: 一&#xff0c;如何有效地对网络客户进行分类 在网上交易的过程中&#xff0c;有各种各样的客户。所以要对所有客户进行分类管理&#xff0c;提高效率&#xff0c;增加交易量。 有外…

etcd实现大规模服务治理应用实战

导读&#xff1a;服务治理目前越来越被企业建设所重视&#xff0c;特别现在云原生&#xff0c;微服务等各种技术被更多的企业所应用&#xff0c;本文内容是百度小程序团队基于大模型服务治理实战经验的一些总结&#xff0c;同时结合当前较火的分布式开源kv产品etcd&#xff0c;…

神同步的智能运维体系和世界杯442阵型

世界杯如火如荼地踢&#xff0c;动如脱兔的运动员在屏幕前挥洒汗水、静如处子的程序员们稳坐屏幕前敲键盘。 可是谁说IT人除了盯着屏幕大呼小叫&#xff0c;就没法参与世界杯了呢&#xff1f;不管做的是什么产品什么领域&#xff0c;冥冥之中总有一根红线跟世界杯连接起来。 …

华为机试 - 新学校选址

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 为了解新学期学生暴涨的问题,小乐村要建立所新学校&#xff0c; 考虑到学生上学安全问题,需要所有学生家到学校的距离最短。 假设学校和所有学生家都走在一条直线之上,请问学校建立在什么位置&#xf…

一文详细理解Linux的一些环境基础开发工具使用(上)

前言&#xff1a; 本文章让大家理解Linux一些基础开发工具的使用&#xff0c;例如Linux如何下载一些软件&#xff0c;Linux如何进行编译代码&#xff0c;Linux怎么上传远程仓库等等&#xff0c;其实Linux工具本质也是命令&#xff01;&#xff01; &#x1f49e; &#x1f49e;…