java queue length Java 集合 知识整理 和 面试

java queue length Java 集合 知识整理 和 面试

一、Java 集合体系结构

java queue length

核心分为 (单值集合) 和 Map(键值对集合) 两大分支,顶层接口 提供遍历能力,整体结构如下(标注核心特性):

Java 集合框架

java queue length

java queue length

核心说明:

1. 与 Map 分离:Map 不实现 ,需通过 ()/()/() 转换为 后遍历。

2. 线程安全划分:

○ 非并发集合:、、 等(效率高,多线程易出问题);

○ 并发集合:、、 等(JUC 包,高效安全);

○ 遗留同步集合:、(全局锁,效率低,仅兼容旧代码)。

二、核心接口与实现类详解(补充细节+避坑点)

(一) 接口通用方法

所有单值集合的基础操作,无需记忆,重点关注 遍历相关 和 批量操作:

• 增:add(E e)(成功返回 true,Set 重复时返回 false)、();

• 删:( o)、()、clear();

• 查:size()、()、( o)、();

• 批量判断:()、()(交集)。

(二)List 接口:有序可重复(面试重点)

1. (高频考点)

• 底层:动态扩容的 (JDK1.8 延迟初始化)。

• 核心特性:

○ 查询 O(1)(索引直接访问),增删 O(n)(需移动元素),尾部增删接近 O(1)(无扩容时);

○ 线程不安全:多线程修改会触发

(快速失败)。

• 扩容机制(JDK1.8 重点):

○ 初始容量:默认 10(首次 add() 时初始化数组,避免空集合占用内存);

○ 扩容阈值: * (默认负载因子 0.75,平衡空间与冲突);

○ 扩容逻辑:旧容量 > 1));

○ 避坑点:指定初始容量时(如 new (20)),仍延迟初始化,仅在首次 add 时创建 20 容量数组。

2. (高频考点)

• 底层:双向链表(Node 节点含 prev/item/next 指针),实现 Deque 接口。

• 核心特性:

○ 增删 O(1)(仅改指针,需找到目标节点),查询 O(n)(遍历链表);

○ 可作为 双向队列(()/())、栈(push()=,pop()=);

○ 避坑点:get(int index) 效率极低(遍历链表),切勿用普通 for 循环遍历 。

3. vs (对比强化)

特性

线程安全

是(方法加 ,全局锁)

扩容机制

默认 2 倍,支持指定扩容增量(new (10, 5))

固定 1.5 倍,不支持增量

初始化时机

构造时立即初始化(默认容量 10)

延迟初始化(首次 add 时)

核心缺点

效率低、内存浪费(扩容倍数大)

线程不安全,扩容时复制开销

适用场景

遗留系统、无并发集合可用的场景

单线程/线程安全可控的场景

(三)Set 接口:无序不可重复(去重逻辑是核心)

1. (高频考点)

• 底层:基于 (元素作为 key,value 是固定常量 )。

• 核心特性:

○ 无序(存储顺序 ≠ 插入顺序),允许 1 个 null(key 不可重复);

○ 去重原理(面试必问):

i. 计算元素的 (),得到数组索引;

ii. 若索引位置无元素,直接存入;

iii. 若索引位置有元素(哈希冲突),通过 () 比较:

• () 为 true → 重复,不存入;

• () 为 false → 存入链表/红黑树。

○ 避坑点:自定义类作为 元素时,必须同时重写 () 和 (),否则无法正确去重(默认用 类的地址比较)。

2.

• 底层: + 逻辑(哈希表保证去重,双向链表保证有序)。

• 特性:保持插入顺序,遍历效率比 略低(维护链表开销),适合需有序去重的场景。

3.

• 底层:基于 (元素作为 key,红黑树排序)。

• 核心特性:

○ 有序(自然排序/自定义排序),不允许 null(排序时抛 );

○ 排序方式:

自然排序:元素实现 接口,重写 (T o);

自定义排序:创建时传入 接口实现类(如 new ((::)));

○ 去重逻辑:通过排序接口判断,()/() 返回 0 则视为重复。

(四)Map 接口:键值对集合(面试核心)

1. (重中之重)

• 底层结构(JDK1.7 vs 1.8):

○ JDK1.7:数组 + 链表(拉链法),哈希冲突严重时查询退化至 O(n);

○ JDK1.8:数组 + 链表 + 红黑树(链表长度 ≥8 且数组容量 ≥64 时树化,节点数 ≤6 时退化为链表),查询优化至 O(log n)。

• 核心特性:

○ 无序,key 不可重复(重复覆盖 value),允许 1 个 null key、多个 null value;

○ 线程不安全(多线程 put 可能数据覆盖、JDK1.7 扩容链表死循环)。

• 关键流程(JDK1.8):

a. put 流程:

计算 key 哈希值:hash(key)(对 扰动,减少冲突:(key == null) ? 0 : (h = key.()) ^ (h >>> 16));

计算索引:(n – 1) & hash(n 为数组容量,必须是 2 的幂,保证索引合法);

处理冲突:

• 索引为空 → 新建 Node 存入;

• 索引非空 → key 相同则覆盖 value;

• 红黑树节点 → 红黑树插入;

• 链表节点 → 尾插,插入后判断是否树化;

扩容判断:size > 阈值( * 0.75)→ 扩容为 2 倍。

b. get 流程:索引定位 → 节点匹配(hash + )→ 返回 value,无则返回 null。

2.

• 底层: + 双向链表(维护节点顺序)。

• 核心特性:

○ 有序:默认插入顺序,可指定访问顺序(new (16, 0.75f, true));

○ 访问顺序应用:LRU 缓存(最近访问的节点移到链表尾部,最久未访问的在头部)。

3. vs vs (对比优化)

特性

(JDK1.8)

线程安全

是(全局 锁)

是(节点级 + CAS)

null 支持

key/value 均可为 null

均不可为 null

key/value 均可为 null

底层结构

数组+链表+红黑树

数组+链表

数组+链表+红黑树

扩容机制

1.5 倍(≥16)

2 倍

1.5 倍

并发效率

高(单线程)

低(全局锁)

java queue length

高(锁粒度细,支持多线程扩容)

快速失败

支持( 校验)

支持

不支持(弱一致性)

适用场景

单线程键值对存储

遗留代码兼容

并发场景键值对存储

4.

• 底层:红黑树(自平衡二叉搜索树)。

• 特性:键有序(自然排序/自定义排序),支持范围查询(()/()),不允许 null key。

(五)Queue 接口:队列(重点在并发场景)

1.

• 底层:二叉小顶堆(默认自然排序)。

• 特性:非 FIFO,队首是最小/最大值,不支持 null,线程不安全;

• 扩容:容量

2. (并发核心)

• 核心能力:阻塞插入(队列满时等待)、阻塞获取(队列空时等待),无需手动处理线程同步;

• 常用实现:

○ :数组实现,固定容量,公平锁(按线程等待顺序)可选;

○ :链表实现,默认无界(实际 .),建议指定容量避免 OOM;

• 适用场景:生产者-消费者模型(如日志收集、任务分发)。

三、核心知识点补充(强化理解+避坑)

(一)遍历方式对比(表格更清晰)

遍历方式

适用场景

优点

缺点

迭代器()

所有 集合

支持遍历中安全删除(())

语法略繁琐

增强 for 循环

所有 集合

语法简洁

不支持遍历中删除(抛快速失败)

普通 for 循环

仅 List(支持索引)

可手动控制索引

中效率极低(O(n))

Map 专属遍历

Map 集合( 最优)

() 直接获取键值对

() 需二次 get(低效)

(二)快速失败(fast-fail)vs 安全失败(fail-safe)

1. 快速失败(fast-fail)

• 触发条件:遍历非并发集合(/)时,其他线程修改集合,或当前线程调用集合 ()(非迭代器 ());

• 原理:集合维护 (修改次数),迭代器创建时记录 = ,遍历中若两者不等,抛

;

• 注意:快速失败是「检测机制」,不是「线程安全保证」,仅用于调试。

2. 安全失败(fail-safe)

• 触发条件:遍历并发集合(

/);

• 原理:迭代器遍历的是集合「副本」( 写时复制原数组java queue length Java 集合 知识整理 和 面试, 分段锁无锁遍历);

• 缺点:弱一致性(副本与原集合可能不同步)、内存开销大(复制数组)。

(三)集合工具类(重点用法+避坑)

1. (操作集合的静态工具类)

• 核心方法:

○ 排序:sort(List)/sort(List, )(需元素实现 或传入 );

○ 线程安全包装:(List)(给非线程安全集合加锁,效率低于 JUC 并发集合);

○ 不可变集合:()/(List)(不可增删改,避免外部修改);

○ 查找:(List, key)(需先排序,否则结果无效)。

2. (操作数组的工具类)

• 核心方法:

○ 数组转集合:(T… a)(返回内部类 ,固定长度,不可增删,修改会同步原数组);

○ 避坑:(new int{1,2,3}) 返回 List(基本类型数组视为一个对象),需用包装类数组()。

(四)并发集合补充(JUC 包)

并发集合

底层原理

适用场景

写时复制数组(读无锁,写加锁)

读多写少(如配置缓存)

基于

读多写少的去重场景

e

无锁 CAS 实现

高并发非阻塞队列

链表+阻塞锁

生产者-消费者模型

(五)自定义 key 规范(面试必问)

当自定义类作为 / 的 key 时,必须重写 () 和 ()java queue length,遵循以下原则:

1. () 相等 → () 必须相等(保证相同元素哈希值一致,不重复存储);

2. () 相等 → () 不一定相等(哈希冲突允许,通过 () 进一步判断);

3. 未重写时,默认使用 类的方法(基于对象地址,无法正确去重)。

四、高频面试题及解析(分难度+抓考点)

(一)基础题(理解核心区别)

1. 和 的区别?

• :单值集合的根接口,定义通用操作(add/),子类有 List/Set/Queue;

• :操作集合的静态工具类,提供排序、查找、线程安全包装等方法,不可实例化。

2. List 和 Set 的核心区别?

维度

List

Set

有序性

插入顺序 = 存储顺序(有序)

无序()/有序(/)

重复性

可重复

不可重复

索引访问

支持(get(int index))

不支持(需迭代器)

去重机制

+()/排序接口()

3. 数组和 的区别?

• 数组:固定长度java queue length,支持基本类型+引用类型,无内置操作方法;

java queue length

• :动态扩容,仅支持引用类型(基本类型自动装箱),提供丰富操作(add//sort);

• 联系: 是数组的「动态包装」,底层依赖数组实现。

(二)进阶题(底层原理+流程)

1. 的底层实现(JDK1.7 vs 1.8)?

• JDK1.7:数组 + 链表(拉链法),存在问题:哈希冲突严重时查询 O(n),多线程扩容易形成链表死循环;

• JDK1.8 优化:

a. 结构升级:数组 + 链表 + 红黑树(链表长度 ≥8 且数组 ≥64 时树化);

b. 哈希函数优化:扰动更充分(高 16 位异或低 16 位),减少冲突;

c. 扩容优化:无需重新计算哈希值,仅判断高位是否为 1(因容量是 2 的幂);

d. 插入优化:链表尾插(JDK1.7 头插,易导致死循环)。

2. 的哈希冲突解决方式?

• 哈希冲突:不同 key 计算出相同哈希值,导致数组同一位置存储多个元素;

• 解决方式:拉链法( 核心):数组每个位置挂载链表/红黑树,冲突元素依次存储;

• 其他方式(未采用):

○ 开放地址法:冲突后探测下一个空闲位置(线性探测/二次探测),适合数据量小、冲突少的场景;

○ 再哈希法:多次哈希计算不同索引,效率低。

3. 和 的适用场景?

• :读多写少、频繁索引访问(如列表展示、数据查询);

• :写多读少、频繁增删首尾(如队列/栈操作、消息队列);

• 避坑:切勿用 做随机访问(get(index)),效率极低。

4. 的排序原理?

• 底层依赖 的红黑树结构java queue length,排序核心是「比较接口」:

a. 自然排序:元素实现 接口java queue length Java 集合 知识整理 和 面试,重写 (T o)(返回负数/0/正数表示小于/等于/大于);

b. 自定义排序:创建 时传入 接口(重写 (T o1, T o2));

• 去重逻辑:比较结果为 0 则视为重复元素,不存入。

(三)高阶题(并发+实战)

1. 的底层实现(JDK1.7 vs 1.8)?

维度

JDK1.7

JDK1.8

底层结构

数组 + 链表

数组 + 链表 + 红黑树

锁机制

分段锁( 是 )

节点级锁()+ CAS

扩容方式

每个 独立扩容

多线程协同扩容(CAS 标记转移节点)

并发效率

中等(锁粒度:)

高(锁粒度:节点)

2. 的实现原理及优缺点?

• 原理:读写分离,写时复制(Copy-On-Write):

○ 读操作:无锁,直接访问原数组;

○ 写操作:加锁 → 复制原数组 → 新数组修改 → 替换原数组引用 → 解锁;

• 优点:读操作高效(无锁),遍历安全(不抛快速失败);

• 缺点:写操作开销大(复制数组),弱一致性(迭代器遍历副本);

• 适用场景:读多写少(如配置中心、字典表)。

3. 如何实现 LRU 缓存?(面试实战)

LRU(最近最少使用):淘汰最久未使用的元素,核心用 实现(访问顺序模式):

Java

java queue length

java queue length

• 其他实现: + 双向链表(手动维护节点顺序, 已封装该逻辑,优先使用)。

4. 集合的线程安全实现方式有哪些?

• 方式 1:遗留同步集合(低效):、(全局锁);

• 方式 2:工具类包装(低效):

.(List)(给集合加锁包装);

• 方式 3:JUC 并发集合(推荐):、、(锁粒度细/无锁,高效);

• 方式 4:手动加锁(灵活但易出错): 或 包裹非线程安全集合。

5. 为什么线程不安全?如何解决?

• 不安全表现:

○ JDK1.7:多线程扩容导致链表死循环(CPU 100%);

○ JDK1.8:多线程 put 导致数据覆盖(同一索引位置同时插入);

• 解决方案:

a. 单线程场景:直接用 ;

b. 并发场景:用 (首选);

c. 简单场景:

.(new ())(低效,不推荐)。

五、集合选型建议(实战导向)

业务场景

推荐集合

原因

单线程、键值对、无序

效率高,支持 null

单线程、键值对、有序

保持插入/访问顺序,支持 LRU

单线程、键值对、排序

自然排序/自定义排序,支持范围查询

并发、键值对

高效线程安全,支持高并发

单线程、有序可重复、查询多

索引访问 O(1),效率高

单线程、有序可重复、增删多

首尾增删 O(1),实现 Deque

去重、无序

高效去重,基于

去重、有序

去重+插入顺序,开销略高于

去重、排序

去重+排序,基于

生产者-消费者模型

/

阻塞插入/获取,无需手动同步

读多写少、并发安全

读无锁高效,遍历安全

总结

Java 集合的核心是「结构决定特性」:数组(查询快)、链表(增删快)、红黑树(排序+高效查询)、哈希表(去重+高效读写),面试重点围绕底层结构、扩容机制、线程安全、去重排序展开。建议结合源码(如 的put()、 的grow())深入理解,同时通过实战(如 LRU 缓存、生产者-消费者)巩固应用,才能在面试中灵活应对

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » java queue length Java 集合 知识整理 和 面试

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们