【Java】Java核心要点总结:58
文章目录
- 1. java中 怎么确保一个集合不能被修改
- 2. 队列和栈是什么 有什么区别
- 3. Java8开始的ConcurrentHashMap为什么舍弃了分段锁
- 4. ConcurrentHashMap 和 Hashtable有什么区别
- 5. ReadWriteLock和StampeLock

1. java中 怎么确保一个集合不能被修改
Java 中可以使用 Collections 类的 unmodifiableXXX() 方法来确保一个集合不能被修改。其中,XXX 表示需要被转换的集合类型,如 List、Set、Map 等。这些方法都返回指定集合的不可修改视图。
例如,如果需要确保一个 List 集合不能被修改,可以使用以下方法:
List<String> list = new ArrayList<>();
// 往集合中添加元素List<String> unmodifiableList = Collections.unmodifiableList(list);
// 将 List 转换为不可修改的视图unmodifiableList.add("element"); // 会抛出 UnsupportedOperationException 异常
在上述代码中,将一个 ArrayList 集合转换为了不可修改的 List 视图,并且尝试向该视图中添加新元素,此时会抛出 UnsupportedOperationException 异常。
需要注意的是,虽然通过 unmodifiableXXX() 方法返回的集合视图可以防止对其进行新增、移除、修改等操作,但实际上集合元素本身并没有被修改,因此如果原始集合发生了变化,集合视图也会发生变化。因此,需要确保不会通过其他方式来修改原集合。
2. 队列和栈是什么 有什么区别
队列和栈都是常见的数据结构,其主要区别在于元素的插入和删除顺序不同。
队列(Queue)是一种先进先出(First-In-First-Out,FIFO)的数据结构,类似于排队等待服务。新元素总是被添加到队列的尾部,而最先被添加的元素则总是位于队列的头部,也就是说,在队列中,先进入队列的元素也会先被处理。我们可以通过调用队列的 offer() 方法向队列的尾部添加元素,可以通过 poll() 方法从队列的头部删除元素。
栈(Stack)是一种后进先出(Last-In-First-Out,LIFO)的数据结构,类似于叠罗汉。新元素总是被添加到栈的顶部,而最上面的元素则总是最后一个被处理,也就是说,在栈中,后进入的元素先被处理。我们可以通过调用栈的 push() 方法向栈的顶部添加元素,可以通过 pop() 方法从栈的顶部删除元素。
另外,还有一个明显的区别是队列允许在任何时候插入和删除元素,而栈只能在栈顶进行操作。此外,队列通常有多种实现方式,如线性队列、循环队列和阻塞队列等,每种实现方式都有其特点和适用场景;而栈的实现方式相对单一,大多数情况下只需要使用基本的数组或链表即可。
因此,当需要处理一些按顺序排列的元素集合时,需要先进先出的情况下就可以选择使用队列,如事件、消息等系统;而对于需要依次处理栈顶的情况,就可以使用栈,如表达式求值、函数调用等场景。
3. Java8开始的ConcurrentHashMap为什么舍弃了分段锁
Java8开始的ConcurrentHashMap舍弃了分段锁,主要是为了提高并发性能,这是因为在高并发下使用分段锁会出现一些缺点。
首先,基于分段锁的 ConcurrentHashMap 在处理高并发场景时会出现频繁的竞争,每当有新元素插入到集合中或者需要进行调整时,需要加锁来保证原子性,在竞争激烈的情况下加锁的开销会显得很大,阻碍整个系统的并发度。
其次,分段锁本身也存在一些问题,例如需要维护多个锁对象、容易产生死锁等。虽然 JDK 7 中的 ConcurrentHashMap 引入了 Resize 的方式减少锁的争用,但在极端情况下仍然难以避免锁引起的性能问题。
而在 Java8 中,ConcurrentHashMap 对底层数据结构进行了重构,在实现上使用了 CAS 操作(Compare And Swap,比较并交换)和内存屏障等机制,可以实现更高效的非阻塞并发操作。这种方式在多线程访问时避免了锁的开销,在性能表现上能够更好地支持高并发访问,相对于分段锁提供了更好的性能和可扩展性。
另外,在 Java8 中还引入了红黑树(Red-Black Tree)来代替链表,解决了 JDK 7 中并发度低且插入元素慢的问题,同时也让每个线程拥有尽量少的锁操作。这些改进与优化,都大大提升了 ConcurrentHashMap 的效率和性能表现。
4. ConcurrentHashMap 和 Hashtable有什么区别
ConcurrentHashMap 和 Hashtable 都是线程安全的集合类,它们之间有以下几点区别:
同步方式不同
Hashtable 通过 synchronized 关键字来实现同步,对整个对象进行锁定,因此同一时刻只能有一个线程访问该对象。而 ConcurrentHashMap 则通过分段锁(JDK7及之前版本)或者无锁算法(JDK8及以上版本)来实现同步,不同的线程可以同时访问不同部分的数据,因此并发度相对较高,性能也更好。
数据结构不同
Hashtable 的数据结构是数组加链表,当一个链表中元素过多时,会产生严重的时间复杂度优化问题。ConcurrentHashMap在 JDK8 版本后引入红黑树来解决这个问题。
空值和空键的处理不同
Hashtable 不允许 null 值和 null 键,如果以 null 作为 key 或 value 的话则会抛出 NullPointerException。而 ConcurrentHashMap 允许 null 值和 null 键。
迭代器的弱一致性策略不同
当其他独立线程改变了 ConcurrentHashMap 集合中的某个数值时,迭代器仍然可以继续工作,而对于 Hashtable 则不能并发迭代,因为 iterators 在遍历时要锁定整个表格,所以将导致其他线程的所有访问被阻塞。
ConcurrentHashMap 相对于 Hashtable 具有更好的并发性和可伸缩性,在高并发场景下,使用 ConcurrentHashMap 可以提供更优秀的性能表现。
5. ReadWriteLock和StampeLock
ReadWriteLock和StampeLock都是Java并发包中提供的锁机制,它们旨在优化对于读写的并发操作。
ReadWriteLock
ReadWriteLock 接口定义了一个读/写锁,它可以同时允许多个线程读取共享资源,但只允许一个线程写入共享资源,当进行写锁定时,所有读取线程和其他写线程请求该锁定将被阻塞。与一般的 Lock 实现不同的是,ReadWriteLock 允许多个线程同时访问某个资源,以达到提高读取操作性能的目的,在读多写少的场景下,使用 ReadWriteLock 可以有效减小锁竞争,提高并发效率。
StampedLock
StampedLock 的实现基于乐观锁的思想,也是为了优化读操作执行的速度而设计的一种锁机制。由于读取操作比写操作更快,StampedLock 采用乐观策略,当进行读取操作时,会尝试乐观获取锁,如果成功,则直接返回数据,否则就退化成传统的悲观锁来获取锁。StampedLock 中也有三种模式:写模式、悲观读模式和乐观读模式。StampedLock 支持可重入,并提供了将悲观锁降级为乐观锁的方法。
在读多写少的场景下,使用读写锁(ReadWriteLock)或 StampedLock 可以取得很好的性能提升效果。但需要注意的是,并不是所有的场景都适合使用读写锁或 StampedLock,在存在大量写操作并且这些写操作耗时很长的情况下,这两种锁机制可能会导致读操作被阻塞,进而影响系统的响应时间。

相关文章:
【Java】Java核心要点总结:58
文章目录 1. java中 怎么确保一个集合不能被修改2. 队列和栈是什么 有什么区别3. Java8开始的ConcurrentHashMap为什么舍弃了分段锁4. ConcurrentHashMap 和 Hashtable有什么区别5. ReadWriteLock和StampeLock 1. java中 怎么确保一个集合不能被修改 Java 中可以使用 Collectio…...
前端面试题---作用域链和原型链
一.JavaScript 中的作用域链是如何工作的? JavaScript 中的作用域链(Scope chain)是一种用于查找变量和函数的机制,它是由嵌套的作用域环境组成的链式结构。 当在 JavaScript 中访问一个变量或函数时,解析器会首先在当前作用域…...
零售品牌私域流量池如何运营?火山引擎数智平台提供全套产品组合
虽然距离6月18日还有两周时间,但各大平台的第一波618战绩(预售尾款)已经相继出炉。 5月31日晚8点,京东率先公布618开门红10分钟销售战报:10分钟内,成交额破亿品牌数同比增长23%,超六成的新商家…...
rk3568 SD卡启动
rk3568 SD卡启动 SD卡启动系统,它可以让rk3568在没有硬盘或其他存储设备的情况下启动和运行操作系统。这使得rk3568变得与树梅派一样灵活切换系统,与此同时进行故障排查和修复,而不需要拆卸设备或者使用专业的烧录工具。SD卡启动还可以方便地…...
English Learning - L3 作业打卡 Lesson5 Day34 2023.6.7 周三
English Learning - L3 作业打卡 Lesson5 Day34 2023.6.7 周三 引言🍉句1: The woman reading the romantic novel could be a lawyer.成分划分弱读连读爆破语调 🍉句2: She just wants a light read to take her mind off work.成分划分弱读连读爆破语调…...
【运筹优化】最短路算法之A星算法 + Java代码实现
文章目录 一、A星算法简介二、A星算法思想三、A星算法 java代码四、测试 一、A星算法简介 A*算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 二、A星算…...
[6]PCB设计实验|认识常用元器件|电阻器|18:30~19:00
目录 一、电阻器主要用途 1. 稳定和调节电路中的电流和电压 2. 作为分流、分压和负载使用 二、常见电阻器 1. 贴片电阻 2. 热敏电阻 3. 限流电阻 4. 可调电阻 5. 排阻(网络电阻) 三、几种常用电阻器的结构特点 四、电阻的参数 1. 额定功率 电阻器功率的表示 2…...
Webots R2021a教程
文章目录 Windows安装设置中文打开世界添加贴图 为外部控制器配置Anaconda解决报错:CondaSSLError: Encountered an SSL error. Most likely a certificate verification issue.调用Python API Windows 安装 进入下载页面 https://github.com/cyberbotics/webots/r…...
C++ 输出格式控制
C 输出格式控制 需包含头文件: 浮点数精度、域宽、填充 操作符功能right-alignedright-alignedsetprecision(int n)设置以n表示的数值精度setw(int n)设置以n表示的域宽setfill(char c)设置以c表示的填充字符 输出格式 操作符功能oct以八进制格式输出数据dec以…...
【C++】引用和右值引用
目录 1. 引用 1.1 引用的概念 1.2 引用的特性 1.3 引用的使用场景 1.3.1 作为参数 1.3.2 作为返回值 1.4 常量引用 1.5 引用和指针的区别 2. 左值和右值 3. 右值引用 3.1 右值引用的概念 3.2 左值持久;右值短暂 3.3 变量是左值 3.4 标准库move函数 1.…...
NodeJS MongoDB⑦
文章目录 ✨文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持😘前言Node&MongoDB 第一步 连接数据库 第二步 创建User Mongodb模型 第三步 简单使用 Mongodb命令 第四步 规范使用 Mongodb命令 (…...
情感分析实战(中文)-共现语义篇
情感分析实战(中文)-共现语义网络分析 背景:该专栏的目的是将自己做了N个情感分析的毕业设计的一个总结版,不仅自己可以在这次总结中,把自己过往的一些经验进行归纳,梳理,巩固自己的知识从而进一步提升,而帮助各大广大学子们,在碰到情感分析的毕业设计时,提供一个好的…...
【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)
一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列(静态队列)1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…...
【区块链 | L2】作为Layer2赛道的领跑者,如何理解 Arbitrum?
上周我们介绍了以太坊L2扩展解决方案Optimism,本周我们继续介绍另一个L2解决方案——Arbitrum。Arbitrum 是以太坊的一个 Optimistic Rollup L2 可扩展性解决方案。 Part.1 什么是Arbitrum? Arbitrum 是一个构建在以太坊之上的区块链网络。你可以使用 Arbitrum 链来做任何在…...
【协议】NVMe over RoCE |nvmeof
什么是nvme nvme ssd和普通ssd区别 ssd是固态硬盘,普通的ssd配的是SATA口(AHCI协议),nvme ssd配的是PCIe口(nvme传输协议) 相比普通SSD的SATA口,nvme的PCIe口有巨大的性能优势。 更多详情见&…...
硬件设计电源系列文章-DCDC转换器布局设计
文章目录 概要 整体架构流程 技术名词解释 1.开关电源PCB布局要点 2.输入电容的放置 3.二极管的放置 4.散热孔的放置 5.反馈路径的走线 小结 概要 提示:这里可以添加技术概要 例如: 本文主要DCDC转换器布局方面的知识。 整体架构流程 提示…...
「从入门到精通,一位设计师分享学习Illustrator的技巧和经验!」
学习Illustrator的个人笔记:从入门到精通 Adobe Illustrator是一款广泛使用的矢量图形软件,用于创建各种设计作品,如商标、海报、名片等。在本篇博客中,我将分享学习Illustrator的经验和技巧,帮助您更好地掌握这一工具…...
RedisGraph的整体架构
The architecture of RedisGraph 本文关注RedisGraph的整体架构,分别从图存储模型、索引、并发控制、和执行计划四个方面简要阐述。下图为RedisGraph的整体架构图。 1 图存储模型 了解一个图数据库的架构,最重要的就是其图存储模型,即其中的…...
C#可视化 家用轿车信息查询系统(具体做法及全部代码)
目录 题目: 效果图: 数据库: 做法: combobox值更新 查询按钮功能(非空验证,查询数据) datagirdview设置 全部代码: DBHelper类 From1主窗体代码 题目: 效果图&#…...
Nautilus Chain全球行分享会,上海站圆满举办
在北京时间 6 月 9 日,由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动,在上海顺利举办,本次分享会联合主办方还包 括 Stanford Blockchain Accelerator、Zebec Protocol、Tiger VC DAO、Crypto PHD、Rootz La…...
OpenClaw多模态扩展:Qwen3.5-4B-Claude处理截图与PDF
OpenClaw多模态扩展:Qwen3.5-4B-Claude处理截图与PDF 1. 为什么需要多模态能力? 去年夏天,我遇到一个头疼的问题:需要从几百份PDF报告里提取关键数据。手动复制粘贴不仅耗时,还容易出错。当时我就在想,如…...
语音播报实时
目录 GPT-SoVITS(强烈推荐) Fish Speech-1.5 GPT-SoVITS(强烈推荐) RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) Fish Speech-1.5 追求极致流畅的实时对话&a…...
设计师必看:Photoshop混合模式实战指南,5分钟搞定光影合成与氛围感调色
Photoshop混合模式实战指南:5分钟掌握光影合成与氛围调色 当你在深夜赶稿时,突然发现人物照片缺乏立体感,或是产品静物图需要增强戏剧性光影——这就是混合模式大显身手的时刻。不同于繁琐的曲线调整和复杂的蒙版操作,混合模式就像…...
从零开始:如何用开源方案打造你的第一台六足机器人
从零开始:如何用开源方案打造你的第一台六足机器人 【免费下载链接】hexapod 项目地址: https://gitcode.com/gh_mirrors/hexapod5/hexapod 想要亲手制作一台能够自如行走的六足机器人吗?hexapod开源项目为你提供了一套完整的免费解决方案&#…...
别再让PowerBI报告挤成一团了!用按钮+书签,一个页面搞定趋势和明细分析
PowerBI交互设计进阶:用按钮与书签打造空间魔术 当业务分析报告遇上数据爆炸时代,信息过载与界面拥挤成为每个分析师挥之不去的噩梦。我曾见过某零售企业的季度分析仪表板——12个图表密密麻麻挤在A4纸大小的画布上,趋势线相互缠绕ÿ…...
手把手教你用XCVU3P和FMC+接口搭建高性能PCIe载板(附原理图下载)
基于XCVU3P与FMC的高性能PCIe载板开发实战指南 在当今高速数据处理领域,FPGA因其并行计算能力和可重构特性成为关键器件。Xilinx UltraScale系列的XCVU3P芯片配合FMC扩展接口,为开发者提供了强大的硬件加速平台。本文将深入解析如何从零开始构建一个支持…...
Lobe Theme:为Stable Diffusion WebUI注入现代设计美学的终极界面解决方案
Lobe Theme:为Stable Diffusion WebUI注入现代设计美学的终极界面解决方案 【免费下载链接】sd-webui-lobe-theme 🤯 Lobe theme - The modern theme for stable diffusion webui, exquisite interface design, highly customizable UI, and efficiency …...
如何快速掌握Windows文件夹色彩管理:Folcolor免费工具终极指南
如何快速掌握Windows文件夹色彩管理:Folcolor免费工具终极指南 【免费下载链接】Folcolor Windows explorer folder coloring utility 项目地址: https://gitcode.com/gh_mirrors/fo/Folcolor 你是否曾在密密麻麻的黄色文件夹中迷失方向?每天花费…...
java自动带注释
...
Python子解释器隔离全解密(从PyThreadState到_PyInterpreterState):20年源码级剖析,首次公开CPython内部隔离边界图谱
第一章:Python子解释器隔离的演进脉络与核心挑战Python长期以来依赖全局解释器锁(GIL)保障线程安全,但这也限制了真正的并行执行能力。为突破这一瓶颈,CPython自3.12起正式引入子解释器(subinterpreters&am…...
