Java八股复习指南-集合

news/2024/11/16 15:44:07/文章来源:https://www.cnblogs.com/forest-pan/p/18407711

Java集合

Map

HashMap

实现原理/底层

Java1.8之前:数组加链表

Java1.8之后:当一个链表的长度超过8,且数组大小超过64时,会将链表转换成红黑树存储,查找效率更高,时间复杂度O(log n)。如果长度超过8,但是数组容量不足64,则会选择扩容数组。

定位算法

计算key的哈希值,并进行与运算

int index = hash & (table.length - 1);

327b6ce496363ad358efda4838aff0d1

扩容机制

HashMap扩容因子为0.75,当元素个数超过总容量的75%时,则会触发扩容。

主要分为两个步骤:

  1. 对哈希表长度扩展成2倍

  2. 将旧哈希表中的数据放入新的表中

为什么是2倍?如何放入新表?

1713514753772-9467a399-6b18-4a47-89d4-957adcc53cc0

通过将长度进行2次幂扩容,在重新计算hash值时,只需要看新增位是1还是0,是0则索引不变,是1则变成“原索引+oldCap”。这样既节省了重新计算hash的时间,同时也将冲突的节点均匀分散了。

put方法

1720684054342-1e3cb2a9-532e-40b8-b5cf-0043811391dc

  • 根据要添加的键的哈希码计算在数组中的索引
  • 判断对应位置是否有键值对

如果为空,则根据键值对直接创建Entry对象,把该对象存入相应位置。

  • 如果该位置存在其他键值对,检查第一个键值对的哈希码和键是否与要添加的键值对相同(equals()和hashcode())

如果相同,说明添加的是同一个键,使用新值替换旧值,完成更新

  • 如果不相同,则继续遍历链表或红黑树,查找是否有相同的键

如果有相同的值,则使用新值替换旧值,完成更新。

如果没有相同的值,则将新的键值对添加到链表或红黑树。

  • 检查链表长度是否超过阈值(8)

如果链表长度超过8,且数组容量超过64,则会将链表转换成红黑树。

  • 检查负载因子是否超过阈值(0.75)

如果键值对的数量与数组的长度大于阈值,则触发扩容。(链表长度>8,数组容量<64也会触发扩容)

  • 扩容操作

  • 完成添加操作

ConcurrentHashMap

底层实现:

Java1.8之前:底层实现是数组+链表的形式(Segment[]和HashEntry[])

使用分段锁,将整个哈希表分成多个段,每个段都维护自己的哈希表和锁。

Java1.8之后:底层实现是数组+链表/红黑树的形式

主要通过 volatile + CAS 或者 synchronized 来实现的线程安全的。

加锁机制:

分段锁:

将整个数据结构分为多个Segment后,每个Segment都有自己的锁,对不同Segment的操作互不影响,从而提升并发性能。

乐观锁/悲观锁

添加元素时,判断计算的hash是否有元素,如果没元素,则会使用乐观锁CAS,如果发生了hash碰撞则使用悲观锁synchronized。这是因为发生hash碰撞时,大概率是线程竞争比较激烈的时候,使用悲观锁保证线程安全。

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

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

相关文章

幂函数与指数函数区别

本文来自博客园,作者:cytlz2730,转载请注明原文链接:https://www.cnblogs.com/cytwjyy/p/18407701

zabbix“专家坐诊”第255期问答

问题一 Q:大家好,问一下,zabbix做聚合图的时候,可以做到两根线在一个图里- 吗?还是说只能,单边计算聚合,然后再最后作图的时候,添加两条线上去A:两个数据吗 Q:是的。一个端口,有进有出 A:如果是两个监控项可以做到聚和一起问题二 Q:请问大佬们,这个加密是干嘛的?…

项目管理方法,方法和框架–初学者指南

项目可以通过各种方式成功结束。但是,最好,最受欢迎的项目管理方法,方法和框架总是在变化。新概念无时无刻不在出现。所有成功的项目都包含一整套方法,工具和技术。实际上,作为项目管理从业人员,您一生中可能会使用其中的一种以上。 但是,项目管理方法论,方法和框架不仅…

Nodejs-child_process模块解读

在 Node.js 应用程序中,child 进程模块非常重要,有了它可以实现并行处理,这在资源密集型在 Node.js 应用程序中,child 进程模块非常重要,有了它可以实现并行处理,这在资源密集型任务里十分重要。 在本文中,我们将看一下 child 进程模块,解释其目的、使用方式以及如何使…

HPC环境下数据下载:安全与效率的完美平衡!

在能源行业,高性能计算(HPC)应用广泛,比如地震数据处理、油气藏模拟和建模、地理空间分析、风模拟和地形映射等。随着数据量的爆发式增长,HPC环境下数据下载面临着严峻的安全挑战,如何在保障数据高效流转的同时,确保数据安全,成为能源企业必须面对的重要课题。 高性能…

【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道

安全数据交换系统是一种专门设计用于在不同的网络、系统或组织之间安全地传输数据的软件或硬件解决方案。这种系统通常包含多种安全特性,以确保数据在传输过程中的保密性、完整性和可用性。 安全数据交换系统可以解决哪些问题? 安全数据交换系统主要解决以下问题: 数据泄露风…

采集DNP3设备数据 转 IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置网关采集DNP3协议数据 2 5 用IEC61850协议转发数据 4 6 网关使用多个逻辑设备和逻辑节点的方法 6 7 案例总结 7 1 案例说明设置网关采集DNP3协议设备数据 把采集的数据转成IEC61850协议转发给其他系统。2 VFBOX网关…

强!70.3K star ! 推荐一款功能强大、开源、可视化的性能实时监控系统:Netdata

在当今复杂多变的IT环境中,系统性能的实时监控与分析对于确保业务连续性、系统稳定运行以及快速故障排查至关重要。随着云计算、大数据和微服务架构的普及,对监控系统的要求也日益增高。 今天给大家推荐一款性能监控工具为:Netdata。 它作为一款开源、实时、轻量级的系统性能…

windows 上 Tauri 开发环境配置

Tauri 是一个构建适用于所有主流桌面和移动平台的轻快二进制文件的框架。开发者们可以集成任何用于创建用户界面的可以被编译成 HTML、JavaScript 和 CSS 的前端框架,同时可以在必要时使用 Rust、Swift 和 Kotlin 等语言编写后端逻辑。 Tauri 使用 Microsoft C++ 构建工具进行…

南沙C++信奥老师解一本通题:1203:扩号匹配问题

​ 【题目描述】在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹…

Cisco Catalyst Center 2.3.7.6-VA 发布下载,新增功能概览

Cisco Catalyst Center 2.3.7.6-VA 发布下载,新增功能概览Cisco Catalyst Center 2.3.7.6-VA - 网络管理和自动化 Cisco Catalyst Center - Network Management and Automation 请访问原文链接:https://sysin.org/blog/cisco-catalyst-center/,查看最新版。原创作品,转载请…