JAVA集合框架、CAS、AQS

目录

一、java 的集合框架有哪些?

二、说-下 ArrayList 和 LinkedList?

三、HashSet和TreeSet的区别?

四、HashMap 的数据结构是什么?

五、CAS机制

六、AQS理解


一、java 的集合框架有哪些?

Collection 是 Java 集合框架中的一个根接口,位于 java.util 包中。它代表了一组对象,即它是一个对象的集合。

二、说-下 ArrayList 和 LinkedList?

        ArrayList 是最常用的 List 实现类, 内部是通过数组实现的, 它允许对元素进行快速随机访问。数 组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数 组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进 行复制、移动、代价比较高。因此, 它适合随机查找和遍历, 不适合插入和删除。

        LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较 慢。另外,他还提供了List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆 栈、队列和双向队列使用。

  • 数组实现List:数组是一种连续的内存空间,通过索引可以快速地访问任意位置的元素,这符合 List 接口中按索引访问元素的需求。此外,数组可以通过动态扩容来支持动态增长的集合。
  • 链表实现LinkedList:链表通过节点间的引用关系来组织数据,这种结构使得在链表的任意位置插入或删除元素变得非常简单和高效,而不需要移动其他元素。这符合 List 接口中要求支持动态添加、删除和访问元素的需求。

三、HashSet和TreeSet的区别?

        HashSet:元素的哈希值是通过元素的hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样, 接着会比较equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是 同一个元素。

        TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序), 每增 加一个对象都会进行排序,将对象插入的二叉树指定的位置。

        Integer 和 String 对象都可以进行默认的 TreeSet 排序, 而自定义类的对象是不可以的, 自己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使用。

HashSet

        无序:不保证元素的插入顺序。

        唯一性:通过equals()方法确保集合中元素的唯一性,允许一个null元素。

        性能:在添加、删除和查找操作上通常比TreeSet快,时间复杂度接近O(1)。

        用途:适用于需要快速查找且不要求排序的场合。

TreeSet

        有序:根据元素的自然顺序或构造时指定的Comparator进行排序。

        唯一性:通过compareTo()方法(或Comparator的compare方法)确保集合中元素的唯一性,不允许null元素。

        性能:在添加、删除和查找操作上的时间复杂度为O(log n),因为基于红黑树实现。

        用途:适用于需要保持元素排序的场合。

四、HashMap 的数据结构是什么?

        底层是采用数组结构来存储数据元素,默认长度16,通过put方法去添加数据hashmap会根据key的hash值进行取模运算,最终把值保存到数组的一个指定位置,这样会存在hash冲突:两个不同的hash值的key,最终取模会落到同一个数组下标,所以引入了链式寻址法来解决hash冲突,对应存在冲突的key,hashmap 把这些key 组成一个单项链表,然后采用尾插法 把key保存到链表的一个尾部,另外为了避免链表长度过长,导致我的查询效率下降,所以当链表长度大于8,并且数组长度大于64,hashmap会把当前链表转换为红黑树,从而减少链表数据查询的时间复杂度,来提升查询效率。

HashMap 是线程安全的吗?为什么?

  1. 非同步操作:HashMap的操作不是线程同步的。在多线程环境下,如果有多个线程同时对HashMap进行读写操作,就可能导致数据不一致的问题。因为HashMap没有采取任何措施来同步这些操作,所以无法保证操作的原子性和可见性。
  2. 非原子性操作:HashMap的某些操作(如put()方法)包含多个步骤,如计算哈希值、查找或插入元素等。这些步骤如果由不同的线程并发执行,就可能因为中间状态的可见性问题而导致数据不一致。
  3. 容量扩容:当HashMap中的元素数量超过其容量的一定比例时,HashMap会进行扩容操作。这个过程包括重新计算元素的哈希值、重新分配存储位置,并复制原数组中的元素到新数组中。如果在这个过程中有其他线程对HashMap进行修改,就可能导致数据丢失或出现异常。

知道线程安全的 Map 有哪些?

hashtable:在put、get、containsKey方法上添加synchronized关键字来保证线程安全

ConcurrentHashMap

ConcurrentHashMap 为什么是线程安全的?

整体架构:

jdk1.8 由数组+红黑树+单向链表构成,默认初始化长度16的数组,由于核心仍是hashmap,必然会存在hash冲突, 所有concurrenthashmap 采用链式寻址的方式解决hash 冲突,当hash冲突比较多的时候,会造成链表长度问题, 1.8引入红黑树,当数组长度大于64,并且链表长度大于8,单向链表会转化为红黑树。当链表长度小于8,红黑树就会退化为单项链表

基本功能:在hashmap基础上提供了并发安全的实现,通过对于node节点去加锁,来保证数据更新的安全性,性能方面优化

        jdk1.8 concurrent。。。 的锁粒度是数组中某一个节点,

        jdk1.7 锁定的是segment 锁的范围要更大,性能上会更低,

        引入红黑树,降低数据查询的时间复杂度

        当数组长度不够的时候,对数组进行扩容, 引入了多线程并发扩容(多个线程对原始数组进行分片),每个线程负责对一个分片的迁移。

五、CAS机制

cas 是java中unsafe类里面的一个方法,全称:CompareAndSwap 比较并交换

主要功能: 保证在多线程环境下,对于共享变量修改的一个原子性

例子: 有一个成员变量state默认值为0 ,定义了一个方法,逻辑为,先判断state 是否为0,如果为0 就修改为1,在单线程没有任何问题,多线程下会存在原子性问题

是一个 read -write 操作, 一般解决会在方法 加 synchronized同步锁来解决,但 是加锁 会带来性能上的损耗, 所以可以采用cas 机制进行优化 调用 compareandswaplint

六、AQS理解

AQS是多线程同步器,提供了两种锁的机制

排它锁:存在多个线程去竞争同一共享资源的时候,同一时刻只允许一个线程去访问这样一个共享资源,也就是多个线程中只能有一个线程去获得一个锁资源,比如 lock中的Reentrantlock重入锁,就是用到了aqs中排它锁功能

共享锁:也称为读锁,同一时刻允许多个线程同时获得锁的资源

aqs作为互斥锁 需要解决三个核心问题

        6.1、互斥变量的设计 如何保证多线程同时更新互斥变量的时候线程的安全性

        采用int 类型的互斥变量 state,用来记录锁竞争的状态 (0--没有 >=1 有线程持有)

        6.2、线程获取锁资源 先会判断 state 是否为0 如果是 更新状态为1 表示占有到锁

        如果多个线程同时做一个操作,导致线程安全性问题,aqs 采用cas机制保证state

互斥变量更新的一个原子性

        6.3、未竞争到锁资源的线程等待 以及竟遭到锁的资源释放锁之后的唤醒

        为获取到的线程 通过unsafe类中的park方法,去进行阻塞,把阻塞的线程按照先进先出的原则去加入到一个双向链表的一个结构中当获取到锁资源的线程释放锁之后,会从双向链表的头部去唤醒下一个等待的线程,再去竞争锁

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

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

相关文章

【SVN的使用-源代码管理工具-命令行的使用 Objective-C语言】

一、接下来,我们来说一个终端的命令行的使用, 1.我们说,你的电脑里边呢,有终端, 在Mac里边,你想新建一个txt,应该怎么写,对,打开文本编辑, 打开这个东西,写点儿东西,然后保存一下,保存的时候,你还要去选择格式, 现在,如果我们用命令行,可以更方便一些, 2.首…

【基于R语言群体遗传学】-10-适应性与正选择

在之前的博客中,我们学习了哈代温伯格模型,学习了Fisher模型,学习了遗传漂变与变异的模型,没有看过之前内容的朋友可以先看一下之前的文章: 群体遗传学_tRNA做科研的博客-CSDN博客 一些新名词 (1&#xf…

MySQL 中的 DDL、DML、DQL 和 DCL

文章目录 1. 数据定义语言(DDL)2. 数据操作语言(DML)3. 数据查询语言(DQL)4. 数据控制语言(DCL)总结 在 MySQL 数据库管理系统中,SQL 语句可以根据其功能分为不同的类别&…

RAG 案框架(Qanything、RAGFlow、FastGPT、智谱RAG)对比

各家的技术方案 有道的QAnything 亮点在:rerank RAGFLow 亮点在:数据处理index 智谱AI 亮点在文档解析、切片、query改写及recall模型的微调 FastGPT 优点:灵活性更高 下面分别按照模块比较各框架的却别 功能模块QAnythingRAGFLowFastG…

TP8/6 子域名绑定应用

原www.xxx.com/admin改为admincms.xxx.com config/app.php 官方文档:ThinkPHP官方手册

赋值运算符重载和const成员函数和 const函数

文章目录 1.运算符重载(1)(2)运算符重载的语法:(3)运算符重载的注意事项:(4)前置和后置重载区别 2.const成员函数3.取地址及const取地址操作符重载4.总结 1.运算符重载 (1) 我们知道内置类型(整形,字符型,浮点型…)可以进行一系…

2024-07-05 base SAS programming学习笔记9(variables)

1.在数据集增加累加变量值(SUM) 求和语句(SUM STATEMENT):variableexpression variable是累积求和的变量名,为数值型,默认初始值为0;该variable值则会保留到一个观测 当expression有缺失值,在求…

【项目管理】常见的敏捷实践:Scrum框架

【项目管理】常见的敏捷实践:Scrum框架 精益、敏捷与Scrum框架Scrum框架实践Sprint(冲刺)Scrum角色Scrum工件Scrum会议 精益、敏捷与Scrum框架 敏捷与精益思想、看板、Scrum等概念的关系如下图所示: Lean 精益 Kanban 看板 Ag…

文件存储的方法一

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值…

机器学习训练之使用静态图加速

前言 MindSpore有两种运行模式:动态图模式和静态图模式。默认情况下是动态图模式,也可以手工切换为静态图模式。 动态图模式 动态图的特点是计算图的构建和计算同时发生,符合Python的解释执行方式。在调试模型时较为方便,能够实…

开发者评测|操作系统智能助手OS Copilot

操作系统智能助手OS Copilot 文章目录 操作系统智能助手OS CopilotOS Copilot 是什么优势功能 操作步骤创建实验重置密码创建Access Key配置安全组安装 os-copilot环境变量配置功能评测命令行模式多轮交互模式 OS Copilot 产品体验评测反馈OS Copilot 产品功能评测反馈 参考文档…

做测试/爬虫 selenium 元素定位 谷歌浏览器 插件推荐,提高元素定位效率

注:插件均在谷歌应用商店 下载 1.XPath Helper 插件 作用:用于Html中对目标字段或者属性值进行匹配 快捷启动:ctrl shift x 示例图如下: 2. ChroPath 插件 作用: 提高元素定位效率 启动:谷歌浏览器 按 F12 -&g…

【电商系统开发实用接口指南】包含国内国外多电商平台商品数据对接(附文档)

关于电商数据接口 开发电商系统的朋友对于电商平台API肯定不陌生,API接口即应用程序编程接口,电商平台开放部分API接口,供商家和服务商调用,以满足电商业务管理需求。随着电商市场需求的日益增长以及技术手段的不断成熟&#xf…

【C++第十课 - stack_queue】stack、queue的使用、适配器模型stack、queue和priority_queue的底层实现、deque

目录 一、stack使用1、push2、pop3、empty4、top题目1、最小栈2、栈的压入、弹出序3、逆波兰表达式求值 二、queue的使用priority_queue习题 三、适配器stack的底层实现queue的底层实现priority_queue的底层实现仿函数/函数对象函数指针 四、deque 一、stack使用 stack是个容器…

聚焦大模型应用落地,2024全球数字经济大会人工智能专题论坛在京举办

7月1日下午,2024全球数字经济大会人工智能专题论坛在中关村国家自主创新示范区会议中心举办。论坛紧扣大模型应用落地这一热点,以“应用即未来——大模型赋能千行百业,新生态拥抱产业未来”为主题,备受社会各界关注。 一、北京已…

Windows中Git的使用(2024最新版)

Windows中Git的使用 获取ssh keys本地绑定邮箱初始化本地仓库添加到本地缓存区提交到本地缓存区切换本地分支为main关联远程分支推送到GitHub查看推送日志 Git 2020年发布了新的默认分支名称"main",取代了"master"作为主分支的名称。操作有了些…

【已解决】: fatal error: cuda_runtime_api.h: No such file or directory

既然他找不到,我们就把路径给他写清楚! 检查自己是不是有这个文件: 去路径/usr/local下,使用命令查询是否拥有该文件: find . -name cuda_runtime_api.h结果: 因为我要使用的是cuda-11.3,因…

【Spring Cloud】一个例程快速了解网关Gateway的使用

Spring Cloud Gateway提供了一个在Spring生态系统之上构建的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的路由方式,并为它们提供一些网关基本功能,例如&…

自用款 复制粘贴工具 Paste macOS电脑适配

Paste是一款专为Mac和iOS用户设计的剪贴板管理工具,它提供了强大的剪贴板增强功能。Paste能够实时记录用户复制和剪切的内容,包括文本、图片、链接等多种数据类型,并形成一个可视化的剪贴板历史记录,方便用户随时访问和检索。此外…

【论文通读】RuleR: Improving LLM Controllability by Rule-based Data Recycling

RuleR: Improving LLM Controllability by Rule-based Data Recycling 前言AbstractMotivationSolutionMethodExperimentsConclusion 前言 一篇关于提升LLMs输出可控性的短文,对SFT数据以规则的方式进行增强,从而提升SFT数据的质量,进而间接帮…