图文详解Java集合面试题

article/2025/8/4 23:30:24

文章目录

  • 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.hkcw.cn/article/rujbTbTClm.shtml

相关文章

深度学习|pytorch基本运算-乘除法和幂运算

【1】引言 前序学习进程中,已经对pytorch张量数据的生成和广播做了详细探究,文章链接为: 深度学习|pytorch基本运算-CSDN博客 深度学习|pytorch基本运算-广播失效-CSDN博客 上述探索的内容还止步于张量的加减法,在此基础上&am…

Python Day39 学习(复习日志Day4)

复习Day4日志内容 浙大疏锦行 补充: 关于“类”和“类的实例”的通俗易懂的例子 补充:如何判断是用“众数”还是“中位数”填补空缺值? 今日复习了日志Day4的内容,感觉还是得在纸上写一写印象更深刻,接下来几日都采取“纸质化复…

深度解析微服务网关:APISIX、Higress 与 Spring Cloud Gateway 技术对比与实战指南

一、引言 在微服务架构的演进中,API 网关作为流量入口的核心枢纽,其技术选型直接影响系统的性能、可扩展性和安全性。本文将从技术架构、核心功能、性能工程、生态体系等维度,对当前主流的三款网关 ——Apache APISIX(以下简称 APISIX)、Higress、Spring Cloud Gateway(…

rsync服务的搭建

目录 一、rsync介绍 rsync的安装 二、rsync的语法 三、rsync命令使用 1. 本机同步 2. 远程同步 四、rsync作为服务使用 1、尝试启动rsync程序 2、rsync的配置文件介绍 注意事项: 3. rsyncinotify实时同步 3.依赖服务托管xinetd(CentOS 6中rs…

UE5.4.4+Rider2024.3.7开发环境配置

文章目录 一、UE5安装 安装有两种方式一种的源码编译安装、一种是EPIC安装,推荐后者,只需要注册一个EPIC账号就可以一键安装。 二、C环境安装 1.下载VisualStudioSetup 下载链接如下下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 选择社…

spining-lidar的电机和激光雷达体(lidar-imu)之间的标定

一、使用的是面结构标定 也就是用场景中的面结构来约束标定。 二、电机转轴和激光雷达之间的参数有哪些? 1.位置方面,显然,电机转轴是没有高度的,所以优化的相对量就是detax和detaY. 2.角度方面,显然,一开…

内存管理 : 06 内存换出

内存换出的重要性及与换入的关系 现在我们讲第25讲,主题是内存的换出(swipe out)。实际上,上一讲我们讲的是内存的换入,而这一节聚焦于内存的换出。 换入和换出必须合在一起工作,不能只有换入而没有换出。…

SAP财务过账BAPI函数使用以及代码

本文只是整理备用大部分整理自:https://www.cnblogs.com/chaguoguo/p/14006892.html 一、BAPI介绍 BAPI_ACC_GL_POSTING_POST: 主要用于处理总账凭证的过账。 它允许外部系统或程序直接向SAP的总账模块发送过账请求,而无需通过传统的用户…

PyTorch ——torchvision数据集使用

如果下载的很慢,可以试试下面这个

C#里与嵌入式系统W5500网络通讯(4)

怎么样修改W5500里的socket收发缓冲区呢? 需要进行下面的工作,首先要了解socket缓冲区的作用,接着了解缓冲区的硬件资源, 最后就是要了解自己的需求,比如自己需要哪个socket的收发送缓冲区多大。 硬件的寄存器为: 这是 W5500 数据手册中关于 Sn_RXBUF_SIZE(Socket n …

【PostgreSQL 04】PostgreSQL性能飞跃指南:从慢查询到服务器配置的全栈优化实战

PostgreSQL性能飞跃指南:从慢查询到服务器配置的全栈优化实战 关键词: PostgreSQL性能优化、查询优化、数据库调优、执行计划、索引优化、服务器配置、EXPLAIN分析、数据库性能监控 摘要: 你的PostgreSQL查询慢得像蜗牛爬行?数据库…

基于内存高效算法的 LLM Token 优化:一个有效降低 API 成本的技术方案

在使用 OpenAI、Claude、Gemini 等大语言模型 API 构建对话系统时,开发者普遍面临成本不断上升的挑战。无论是基于检索增强生成(RAG)的应用还是独立的对话系统,这些系统都需要维护对话历史以确保上下文的连贯性,类似于…

Marvin - 生成结构化输出 和 构建AI工作流

文章目录 一、关于Marvin1、项目概览2、相关链接资源3、功能特性4、为什么选择Marvin? 二、安装三、示例1、结构化输出工具marvin.extractmarvin.castmarvin.classifymarvin.generate 2、代理式控制流marvin.runmarvin.Agentmarvin.Task 四、核心抽象概念1、任务2、…

智慧新基建数字孪生,绘就桥梁运维新画卷

图扑融合中国风元素,打造智慧桥梁新基建数字孪生体系。以古韵山水风格呈现桥梁三维模型,精准映射结构细节。实时汇聚应力、位移等数据,兼具古典意境与现代科技。助力桥梁全生命周期管理,在传统美学与前沿技术交融中,提…

Codeforces Round 1028 (Div. 2) C. Gellyfish and Flaming Peony

Codeforces Round 1028 (Div. 2) C. Gellyfish and Flaming Peony 题目 Gellyfish hates math problems, but she has to finish her math homework: Gellyfish is given an array of n n n positive integers a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,a…

while循环判断数字位数

while循环 #include <stdio.h> int main() {int x;int n 1;printf("请输入待测数字&#xff1a;\n");scanf("%d",&x);getchar();x / 10;while (x > 0){n;x / 10;}printf("位数为&#xff1a;%d\n",n);printf("请按下回车键退…

牛顿迭代算法-深度解析

牛顿迭代算法-深度解析 一、牛顿迭代算法的起源与基本概念1.1 算法起源1.2 基本概念 二、牛顿迭代算法的原理与推导2.1 几何原理2.2 数学推导2.3 收敛性分析 三、牛顿迭代算法的代码实现3.1 Python实现3.2 C实现3.3 Java实现 四、牛顿迭代算法的时间复杂度与空间复杂度分析4.1 …

SpringAI+DeepSeek大模型应用开发实战

内容来自黑马程序员 这里写目录标题 认识AI和大模型大模型应用开发模型部署方案对比模型部署-云服务模型部署-本地部署调用大模型什么是大模型应用传统应用和大模型应用大模型应用 大模型应用开发技术架构 SpringAI对话机器人快速入门会话日志会话记忆 认识AI和大模型 AI的发…

Python打卡第42天

浙大疏锦行 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 回调函数 Hook本质是回调函数&#xff0c;所以我们先介绍一下回调函数 回调函数是作为参数传递给其他函数的函数&#xff0c;其目的是在某个特定事件发生时被调用执行。这种机制允许代码…

hysAnalyser --- 逐包分析MPEG-TS的功能说明

前言 hysAnalyser 是一款新颖、独具特色的 MPEG-TS 数据分析工具&#xff0c;定位于 1&#xff09;音视频开发和测试人员&#xff1a;和MEPG-TS有关开发、调试、测试辅助&#xff1b; 2&#xff09;和MPEG-TS相关业务系统的运维人员&#xff1a;如数字电视、OTT、互联网流媒体…