JAVA集合框架、CAS、AQS

news2024/11/23 7:38:03

目录

一、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.coloradmin.cn/o/1904976.html

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

相关文章

那些年背过的面试题——MySQL篇

本文是技术人面试系列 MySQL 篇,面试中关于 MySQL 都需要了解哪些基础?一文带你详细了解,欢迎收藏! WhyMysql? NoSQL 数据库四大家族 列存储 Hbase K-V 存储 Redis 图像存储 Neo4j 文档存储 MongoDB 云存储 OSS …

RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录 1、引入 2、Fanout交换机 案例:利用SpringAMQP演示Fanout交换机的使用 3、Direct交换机 案例:利用SpringAMQP演示Direct交换机的使用 4、Topic交换机 案例:利用SpringAMQP演示Topic交换机的使用 1、引入 真实的生产环境都会经过e…

[240707] X-CMD v0.3.14: cb gh fjo zig 模块增强;新增 lsio 和 pixi 模块

目录 X-CMD 发布 v0.3.14✨ advise:Bash 环境下自动补全时,提供命令的描述信息✨ cb:支持下载指定版本的附件资源✨ gh:支持下载指定版本的附件资源✨ fjo:支持下载指定版本的附件资源✨ zig:新增 pm 和 zon 子命令✨ lsio:用于查…

Maven一键配置阿里云远程仓库,让你的项目依赖飞起来!

文章目录 引言一、为什么选择阿里云Maven仓库?二、如何设置Maven阿里云远程仓库?三、使用阿里云Maven仓库的注意事项总结 引言 在软件开发的世界里,Maven无疑是一个强大的项目管理工具,它能够帮助我们自动化构建、依赖管理和项目…

并发处理 优先图和多重图

优先图(Precedence Graph)视图可串性多重图(Polygraph) 优先图(Precedence Graph) 优先图用于冲突可串性的判断。 优先图结构&#xff1a; 结点 (Node)&#xff1a;事务&#xff1b;有向边 (Arc): Ti → Tj &#xff0c;满足 Ti <s Tj&#xff1b; 存在Ti中的操作A1和Tj…

43、nginx的优化、防盗链、重定向、代理

nginx的优化、防盗链、重定向、代理 一、nginx的优化 1.1、隐藏版本号 server_tokens off;隐藏版本号 [roottest1 conf]# vim nginx.confserver_tokens off;[roottest1 conf]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok ngin…

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

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

科大讯飞-群聊对话角色要素提取:不微调范式模拟官网评分

不微调范式模拟官网评分 step1: 模型api配置及加载测试step2: 数据加载与数据分析&#xff1a;测试集分析:step3: prompt设计:step4 :大模型推理&#xff1a;step 5: 结果评分测试&#xff1a;评分细则&#xff1a;评估指标 参考&#xff1a; 比赛说明&#xff1a; #AI夏令营 #…

从打印到监测:纳米生物墨水助力3D生物打印与组织监测平台?

从打印到监测&#xff1a;纳米生物墨水助力3D生物打印与组织监测平台&#xff1f; 在 3D 组织工程中&#xff0c;纳米生物墨水是将纳米材料与 ECM 水凝胶结合&#xff0c;以提高其打印性和功能性的重要策略。纳米生物墨水可以增强水凝胶的机械性能、导电性、生物活性&#xff…

【Transformer】transformer模型结构学习笔记

文章目录 1. transformer架构2. transformer子层解析3. transformer注意力机制4. transformer部分释疑 图1 transformer模型架构 图2 transformer主要模块简介 图3 encoder-decoder示意图N6 图4 encoder-decoder子层示意图 1. transformer架构 encoder-decoder框架是一种处理NL…

卷积神经网络基础篇

文章目录 1、卷积层1.1、激活函数1.3、sigmoid1.4、Tanh1.5、ReLU1.6、Leaky ReLU1.7、误差计算 2、池化层3、全连接层4、CNN训练 参考链接1 参考链接2 1、卷积层 卷积层&#xff08;Convolutional layer&#xff09;&#xff0c;这一层就是卷积神经网络最重要的一个层次&…

数据库的学习(4)

一、题目 1、创建数据表qrade: CREATE TABLE grade(id INT NOT NULL,sex CHAR(1),firstname VARCHAR(20)NOT NULL,lastname VARCHAR(20)NOT NULL,english FLOAT,math FLOAT,chinese FLOAT ); 2、向数据表grade中插入几条数据: (3,mAllenwiiliam,88.0,92.0 95.0), (4,m,George&…

java版企业工程管理系统源码:全方位的项目管理解决方案

工程管理系统是一款专注于建设工程项目全生命周期管理的软件。它覆盖了项目从策划、设计、施工到竣工的每一个阶段&#xff0c;提供全方位的管理功能。系统采用模块化设计&#xff0c;包括系统管理、系统设置、项目管理、合同管理、预警管理、竣工管理、质量管理、统计报表和工…

centos7.9 rpm包安装mysql8.2.0数据库、root设置客户端登录、配置并发、表名大小写敏感、启动重启指令等记录

centos安装mysql8数据库,下载的是rpm-bundle.tar包,这样可以在内网环境离线安装,工作中医院的服务器很多也是内网的,所以这里记录下rpm-bundle.tar包安装的步骤。 lscpu 查看处理器是x86还是arm 下载对应的版本 bundle tar包 ((mysql-8.2.0-1.el7.x86_64.rpm-bundle.tar))…

打造属于你的私人云盘:在 OrangePi AIpro 上搭建个人云盘

随着数字化时代的到来&#xff0c;数据的存储和管理变得愈发重要。相比于公共云存储服务&#xff0c;搭建一个属于自己的个人云盘不仅能够更好地保护隐私&#xff0c;还可以更灵活地管理数据。 近期刚好收到了一个 香橙派 AIpro 的开发板&#xff0c;借此机会用来搭建一个属于…

《算法笔记》总结No.4——散列

散列的英文名是hash&#xff0c;即我们常说的哈希~该知识点在王道408考研的教材里面属于查找的范围。即便各位并无深入了解过&#xff0c;也听说过散列是一种更高效的查找方法。 一.引例 先来考虑如下一个假设&#xff1a;设有数组M和N分别如下&#xff1a; M[10][1,2,3,4,5,6…

idea 默认路径修改

1.查看 idea 的安装路径&#xff08;右键点击 idea 图标&#xff0c;查看路径 &#xff09; “C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1\bin\idea64.exe” 在 bin 目录查看 idea.properties 文件&#xff0c;修改以下四个路径文件 # idea.config.path${user.home}/…

对话大模型Prompt是否需要礼貌点?

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的QA数据集构建&#xff08;附代码&#xff09;Qwen-2-7B和GLM-4-9B&#x…

QT入门笔记-自定义控件封装 30

具体代码如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据@getIndex点击事件获取点击的地区下标和地区名

项目场景&#xff1a; uni-app使用ucharts地图,自定义Tooltip鼠标悬浮显示内容并且根据getIndex点击事件获取点击的地区下标和地区名 例如&#xff1a; 问题描述 官方给的文档有限&#xff0c;需要自己下载地图json数据然后自己渲染和编写鼠标悬浮显示内容以及获取点击地址…