当前位置: 首页 > news >正文

图文详解Java集合面试题

文章目录

  • 1、集合框架
  • 2、ArrayList、LinkedList
  • 3、HashMap、红黑树
  • 4、HashMap的put流程

1、集合框架

两条大支线:
①Collection接口:最基本的集合框架,提供添加、删除、清空等基本操作,主要有三个子接口:i:List:一个有序的集合,包含重复元素。实现类包括ArrayList、LinkedList。ii:Set:一个不包含重复元素集合。实现类包括HashSet、LinkedHashSet、TreeSet。iii:Queue:一个用于保持元素队列集合。实现类包括PriorityQueue、ArrayDeque。
②Map接口:表示键值对的集合,一个键映射到一个值。键不能重复,每个键只能对应一个值。Map接口的实现类包括HashMap、LinkedHashMap、TreeMap。

在这里插入图片描述

集合框架架常用工具类:
集合框架位于java.util包下,提供两个常用工具类:i:Collections:提供一些对集合进行排序、二分查找、同步的静态方法。ii:Arrays:提供一些对数组进行排序、打印、和 List 进行转换的静态方法。

2、ArrayList、LinkedList

①ArrayList基于数组实现,LinkedList基于链表实现。ArrayList利于查找,支持随机访问,LinkedList利于增删。i:ArrayList通过数组下标获取,时间复杂度是O(1);LinkedList需要遍历链表,时间复杂度是O(n)。ii:ArrayList如果增删的是数组尾部,时间复杂度是O(1);如果add的时候涉及到扩容,时间复杂度会上升到O(n)。插入中间位置,把插入位置后的元素向前或者向后移动,甚至还有可能触发扩容,效率低很多,变成O(n)。②LinkedList是链表结构,插入和删除只需要改变前置节点、后置节点和插入节点的引用,不需要移动元素。i:在链表的头部插入或者删除,时间复杂度是O(1)。ii:在链表的中间插入或者删除,时间复杂度是O(n),因为需要遍历链表找到插入位置。iii:如果是在链表的尾部插入或者删除,时间复杂度是O(1)。
③使用场景
ArrayList适用于:i:随机访问频繁:需要频繁通过索引访问元素的场景。ii:读取操作远多于写入操作:如存储不经常改变的列表。iii:末尾添加元素:需要频繁在列表末尾添加元素的场景。LinkedList适用于:i:频繁插入和删除:在列表中间频繁插入和删除元素的场景。ii:不需要快速随机访问:顺序访问多于随机访问的场景。iii:队列和栈:由于其双向链表的特性,LinkedList实现队列(FIFO)和栈(LIFO)

在这里插入图片描述

④ArrayList扩容机制i:当往ArrayList中添加元素时,会先检查是否需要扩容,如果当前容量+1超过数组长度,会进行扩容。ii:扩容后的新数组长度是原来的1.5倍,然后再把原数组的值拷贝到新数组中。

在这里插入图片描述

⑤ArrayList序列化i:在ArrayList中,writeObject方法被重写,用于自定义序列化逻辑:只序列化有效数据,因为elementData数组容量一般大于实际的元素数量,声明时候加transient关键字。ii:出于效率的考虑,不直接序列化数组。数组可能长度100,但实际只用50,剩下50没用到,不需要序列化。
⑥实现ArrayList线程安全方法i:Collections.synchronizedList()方法,通过synchronized关键字加锁实现。返回一个线程安全的 List。SynchronizedList list = Collections.synchronizedList(new ArrayList());ii:CopyOnWriteArrayList:遵循写时复制原则。允许并发读,读操作是无锁。a:往一个容器添加元素,不直接往容器中添加。先复制出一个新的容器,然后在新容器里添加元素,添加完之后,再将原容器引用指向新容器。多个线程在读的时候,不需要加锁,因为当前容器不会添加任何元素。这样实现线程安全。

3、HashMap、红黑树

①JDK8中HashMap的数据结构:数组+链表+红黑树。初值容量:16、负载因子:0.75.扩容为原来的2倍。

在这里插入图片描述

②红黑树是自平衡的二叉查找树,通过左旋和右旋以及染色保持平衡:i:每个节点要么是红色,要么是黑色;ii:根节点永远是黑色;iii:所有的叶子节点都是是黑色的(下图中的 NULL 节点);iv:红色节点的子节点一定是黑色的;v:从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

在这里插入图片描述

使用红黑树原因:i:二叉树每个节点最多有两个子节点,容易出现极端情况。插入数据有序,二叉树就会退化成链表,查询效率O(n)。ii:平衡二叉树要求更高,左右子树高度差为1,保证极佳查找效率,但在进行插入和删除时,频繁旋转维持树平衡,维护成本更高。iii:链表复杂度是O(n),当链表长度较长时,查找性能会下降。红黑树是一种折中的方案,查找、插入、删除的时间复杂度O(log n)。

4、HashMap的put流程

哈希寻址 → 处理哈希冲突(链表还是红黑树)→ 判断是否需要扩容 → 插入/覆盖节点。

在这里插入图片描述

相关文章:

  • 量化面试绿皮书:1. 海盗分金博弈
  • 树莓派3B小练习
  • 【JMeter】性能测试知识和工具
  • Spring AI Image Model、TTS,RAG
  • 区块链可投会议CCF B--EDBT 2026 截止10.8 附录用率
  • 基于React + TypeScript构建高度可定制的QR码生成器
  • Codeforces Round 1028 (Div. 2) C. Gellyfish and Flaming Peony
  • MCU SoC
  • 【Dv3Admin】系统视图系统配置API文件解析
  • 举办中国户外运动展哪个城市较理想
  • Vert.x学习笔记-EventLoop与Context的关系
  • LTSPICE仿真电路:(三十二)差动放大器电流源
  • RPA办公自动化工具初体验
  • 使用 DeepSeek API 搭建智能体《无间》- 卓伊凡的完整指南 -优雅草卓伊凡
  • 【Oracle】数据备份与恢复
  • “候选对话链”(Candidate Dialogue Chain)概念
  • 历年中山大学计算机保研上机真题
  • 【极客日常】分享go开发中wire和interface配合的一些经验
  • DRW - 加密市场预测
  • 多自主水下航行器(AUV)协同围捕策略
  • 做钟点工 网站/易推广
  • 邯郸网站设计怎么做/推广什么app佣金高
  • 网站建设 客户/陕西网络推广公司
  • 校园网站html模板/自然搜索优化
  • 做家教的网站/太原百度推广开户
  • 网站开发及维护是什么/数据分析网站