news 2026/5/17 6:00:48

Java-List,Set,Map(八股)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java-List,Set,Map(八股)

List

实现方法:

ArrayList,LinkedList(两者都不保证线程安全)

底层数据结构:

ArrayList底层使用的是Object数组,LinkedList底层使用的是双向链表。

使用场景:

ArrayList适用于需要频繁访问集合元素的场景。基于数组实现,可以通过索引快速访问元素。当需要频繁访问和遍历集合元素的时候,推荐使用ArrayList。

LinkedList适用于频繁进行插入和删除操作的场景。它基于链表实现,插入和删除元素的操作是需要频繁调整节点的指针,因此在插入和删除操作上具有较高的性能。

ArrayList的扩容机制:
扩容的前置核心前提:

ArrayList底层是基于定长数组实现的,内部维护了一个核心的数组属性elementData,所有元素都存放在这个数组中,这个数组的长度就是ArrayList当前的容量。扩容的本质就是解决数组长度不可变的问题,当数组存满的时候,创建新的更大的数组,把原数组元素复制过去,从而实现容量的增长。

初始化容量规则:

初始化时,底层数组elementData赋值为一个空数组,只有在第一次调用add()方法时,容量扩充为10。

触发机制:

当前元素个数+待添加元素个数 > 底层数组的容量。

扩容规则:

默认1.5倍扩容。

扩容本质:

调用Arrays.copyOf()创建新数组,拷贝原数组元素,重新赋值引用。

Set

实现方法:

HashSet

HashSet的实现原理:

HashSet基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,相关HashSet的操作,基本上都是调用底层HashMap相关方法来完成。

Map

实现方法:

HashMap,HashTable,ConcurrentHashMap(后面两个线程安全)

HashMap底层实现原理:

HashMap底层数据结构在Java8之前是数组+链表的形式,在Java8之后是数组+链表+红黑树的形式。

初始化和扩容机制:

当创建时默认长度为0,调用put方法长度会扩容为16,当我们里面的元素个数/总容量超过默认负载因子0.75时就会进行扩容,每次扩容2倍。

扩容规则:

添加后当链表长度大于8且数组容量大于等于64时则将链表转为红黑树,追加完毕或转为红黑树如果数组内的元素个数大于数组长度*负载因子则进行扩容。

添加元素过程:

当添加对象是首先会对key进行hashCode()运算,再调用HashMap的hash()方法进行二次哈希,计算出桶下标,如果当前下标内容为空直接添加,不为空时则判断key的hashCode()是否一致,如果不一致就向后找,直到下标为空时添加,如果一致则进行equals运算判断内容是否相同,相同则将value进行替换。

索引下标的计算方法:

JDK1.8之前:取模数组长度。

JDK1.8之后:与当前容量-1进行位运算&

ConcurrentHashMap和HashTable:

底层数据结构:JDK1.7的ConcurrentHashMap底层采用分段的数组+链表实现,JDK1.8采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑树。HashTable和JDK1.8之前的HashMap的底层数据结构类似都是采用数组+链表的形式,数组是HashMap的主体,链表则是主要为了解决哈希冲突存在的。

实现线程安全的方法:

在JDK1.7的时候,ConcurrentHashMap对整个桶数组进行了分割分段(Segment,分段所),每一把锁只能锁其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。

到了JDK1.8的时候,用Node数组+链表+红黑树的数据结构来实现,并发控制使用synchronized和CAS来操作。

Hashtable(同一把锁):使用synchronized来保证线程安全。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 8:23:56

RHCSA第一次练习

1.在VMware上创建虚拟机以及安装RHEL9操作系统,使用ssh进行远程连接 注意:最好以管理员权限进入VMware1.1创建虚拟机: 第一步:选择自定义->下一步到以下第二步第二步:选择稍后安装操作系统->一直下一步到第三步页…

作者头像 李华
网站建设 2026/5/6 1:16:10

HunyuanVideo-Foley部署案例:企业级视频内容生产自动化实践

HunyuanVideo-Foley部署案例:企业级视频内容生产自动化实践 随着AI生成技术的不断演进,音视频内容生产的自动化正成为企业降本增效的关键路径。传统音效制作依赖专业音频工程师手动匹配动作与声音,流程繁琐、周期长、成本高。尤其在短视频、…

作者头像 李华
网站建设 2026/5/16 13:40:23

【图像加密】Arnold置乱变换图像加密实验附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#x1…

作者头像 李华
网站建设 2026/5/14 21:00:20

SillyRAT深度剖析:从开源工具到企业安全防线的实战思考

引言:当“教育工具”成为攻击者武器库 在网络安全攻防领域,远程访问工具(RAT)一直扮演着双重角色:既是攻击者渗透和控制的利器,也是安全研究人员理解威胁、构建防御体系的窗口。GitHub上开源的SillyRAT项目,以其Python…

作者头像 李华
网站建设 2026/5/14 19:01:29

探索数据库领域 SQL 的流处理技术

探索数据库领域 SQL 的流处理技术 关键词:数据库、SQL、流处理技术、实时数据处理、流查询、流计算 摘要:本文深入探讨了数据库领域中 SQL 的流处理技术。首先介绍了该技术的背景,包括目的、预期读者、文档结构和相关术语。接着阐述了流处理的核心概念,包括其原理、架构,并…

作者头像 李华
网站建设 2026/5/4 11:10:40

顺丰快递公司物流仓储管理信息系统的开发与应用

文章目录顺丰快递物流仓储管理信息系统的开发与应用--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!顺丰快递物流仓储管理信息系统的开发与应用 顺丰快递作为国内领先的物流服务提供商,其物流仓储管理信…

作者头像 李华