当前位置: 首页 > 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流程

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

在这里插入图片描述

http://www.xdnf.cn/news/756163.html

相关文章:

  • TDengine 基于 TDgpt 的 AI 应用实战
  • 【论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合】
  • vue3中的ref和reactive
  • pc端小卡片功能-原生JavaScript金融信息与节日日历
  • 2024 CKA模拟系统制作 | Step-By-Step | 16、题目搭建-sidecar 代理容器日志
  • 工作流引擎-06-流程引擎(Process Engine)对比 Flowable、Activiti 与 Camunda 全维度对比分析
  • 一位汽车行业从业人员对Simulink热度变化的观察与讨论 (2024)
  • 中国风展示工作总结商务通用PPT模版
  • M-OFDM模糊函数原理及仿真
  • 过滤攻击-聚合数据
  • [Windows]在Win上安装bash和zsh - 一个脚本搞定
  • Maven(黑马)
  • YOLOv7 辅助检测头与重参数化解析2025.6.1
  • 鸿蒙HarmonyOS —(cordova)研发方案详解
  • 数论——质数和合数及求质数
  • 工程的焊接技术
  • 哈尔滨工业大学提出ADSUNet—红外暗弱小目标邻帧检测新框架
  • Altium Disigner(16.1)学习-原理图绘制以及必要操作
  • 批量导出CAD属性块信息生成到excel——CAD C#二次开发(插件实现)
  • Leetcode 3568. Minimum Moves to Clean the Classroom
  • DAY 35 超大力王爱学Python
  • 用Python实现一个简单的远程桌面服务端和客户端
  • xPSR
  • 通俗易懂的 JS DOM 操作指南:从创建到挂载
  • Python进阶与常用库:探索高效编程的奥秘
  • Redis-6.2.9 Sentinel 哨兵配置
  • WSL2 安装与Docker安装
  • 基于微信小程序的scratch学习系统
  • 图像数据如何表示为概率单纯形
  • Github 2025-06-01开源项目月报 Top20