黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+)

article/2025/6/8 0:16:45

一. 算法复杂度分析

1.1 时间复杂度

        时间复杂度分析:来评估代码的执行耗时的

常见的复杂度表示形式

常见复杂度

1.2 空间复杂度

        空间复杂度全称是渐进空间复杂度,表示算法占用的额外存储空间数据规模之间的增长关系

二. 数组

        数组(Array)是一种用连续的内存空间存储相同数据类型数据的线性数据结构

int[] array = {22,33,88,66,55,25};

我们定义了这么一个数组之后,在内存的表示是这样的:

        现在假如,我们通过arrar[1],想要获得下标为1这个元素,但是现在栈内存中指向的堆内存数组的首地址,它是如何获取下标为1这个数据的?

2.1 寻址公式

在数组在内存中查找元素的时候,是有一个寻址公式的,如下:

arr[i] = baseAddress + i * dataTypeSize

baseAddress:数组的首地址,目前是10

dataTypeSize:代表数组中元素类型的大小,目前数组重存储的是int型的数据,dataTypeSize=4个字节

arr:指的是数组

i:指的是数组的下标

有了寻址公式以后,我们再来获取一下下标为1的元素,这个是原来的数组

int[] array = {22,33,88,66,55,25};

套入公式:

array[1] =10 + i * 4 = 14

获取到14这个地址,就能获取到下标为1的这个元素了。

2.2 操作数组的时间复杂度(查找)

        随机查询(根据索引查询)

数组元素的访问是通过下标来访问的,计算机通过数组的首地址和寻址公式能够很快速的找到想要访问的元素

        未知索引查询

情况一:查找数组内的元素,查找55号数据

情况二:查找排序后数组内的元素,查找55号数据

2.3 操作数组的时间复杂度(插入、删除)

        数组是一段连续的内存空间,因此为了保证数组的连续性会使得数组的插入和删除的效率变得很低

总结

三. ArrayList源码分析

分析ArrayList源码主要从三个方面去翻阅:成员变量,构造函数,关键方法

3.1 成员变量

DEFAULT_CAPACITY = 10; 默认初始的容量**(CAPACITY)

EMPTY_ELEMENTDATA = {}; 用于空实例的共享空数组实例

DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};用于默认大小的空实例的共享空数组实例

Object[] elementData; 存储元素的数组缓冲区

int size; ArrayList的大小(它包含的元素数量)

3.2 构造方法

  • 第一个构造是带初始化容量的构造函数,可以按照指定的容量初始化数组

  • 第二个是无参构造函数,默认创建一个空集合

将collection对象转换成数组,然后将数组的地址的赋给elementData

3.3 ArrayList源码分析

添加数据的流程

    四.  ArrayList底层的实现原理

    结论:

    • ArrayList底层是用动态的数组 实现的
    • ArrayList初始容量为0,当第一次添加数据的时候才会初始化容量为10
    • ArrayList在进行扩容的时候是原来容量的1.5倍,每次扩容都需要拷贝数组
    • ArrayList在添加数据的时候
      • 确保数组已使用长度(size)加1之后足够存下下一个数据

      • 计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍)

      • 确保新增的数据有地方存储之后,则将新元素添加到位于size的位置上。

      • 返回添加成功布尔值。

    五. ArrayList list=new ArrayList(10)中的list扩容几次

    答:该语句只是声明和实例了一个ArrayList,指定了容量为10,未扩容

    六. 数组和List之间的转换

    如何实现数组和List之间的转换?

    数组转List,使用JDK中java.util.Arrays工具类的asList方法

    List转数组,使用List的toArray方法。无参toArray方法返回 Object数组,传入初始化长度的数组对象,返回该对象数组

    用Arrays.asList转List后,如果修改了数组内容,list受影响吗

    List用toArray转数组后,如果修改了List内容,数组受影响吗

    回答:

    1.用Arrays.asList转List后,如果修改了数组内容,list受影响吗

    Arrays.asList转换list之后,如果修改了数组的内容,list会受影响,因为它的底层使用的Arrays类中的一个内部类ArrayList来构造的集合,在这个集合的构造器中,把我们传入的这个集合进行了包装而已,最终指向的都是同一个内存地址

    2,List用toArray转数组后,如果修改了List内容,数组受影响吗

    list用了toArray转数组后,如果修改了list内容,数组不会影响,当调用了toArray以后,在底层是它是进行了数组的拷贝,跟原来的元素就没啥关系了,所以即使list修改了以后,数组也不受影响

    七. LinkedList数据结构链表

    7.1 单向链表

    • 链表中的每一个元素称之为结点(Node)

    • 物理存储单元上,非连续、非顺序的存储结构

    • 单向链表:每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。记录下个结点地址的指针叫作后继指针 next

    7.2 单向链表时间复杂度分析

    • 查询操作

    • 插入/删除操作

    7.3 双向链表

    而双向链表,顾名思义,它支持两个方向

    • 每个结点不止有一个后继指针 next 指向后面的结点

    • 有一个前驱指针 prev 指向前面的结点

    双向链表时间复杂度

    总结

    八. ArrayList和LinkedLis区别

    面试官:面试题-ArrayList和LinkedList的区别是什么?

    候选人

    • 底层数据结构

      • ArrayList 是动态数组的数据结构实现

      • LinkedList 是双向链表的数据结构实现

    • 操作数据效率

      • ArrayList按照下标查询的时间复杂度O(1)【内存是连续的,根据寻址公式】, LinkedList不支持下标查询

      • 查找(未知索引): ArrayList需要遍历,链表也需要遍历,时间复杂度都是O(n)

      • 新增和删除

        • ArrayList尾部插入和删除,时间复杂度是O(1);其他部分增删需要挪动数组,时间复杂度是O(n)

        • LinkedList头尾节点增删时间复杂度是O(1),其他都需要遍历链表,时间复杂度是O(n)

    • 内存空间占用

      • ArrayList底层是数组,内存连续,节省内存

      • LinkedList 是双向链表需要存储数据,和两个指针,更占用内存

    • 线程安全

      • ArrayList和LinkedList都不是线程安全的

      • 如果需要保证线程安全,有两种方案:

        • 在方法内使用,局部变量则是线程安全的

        • 使用线程安全的ArrayList和LinkedList


    http://www.hkcw.cn/article/PYqjwxgkBK.shtml

    相关文章

    AI数据集构建:从爬虫到标注的全流程指南

    AI数据集构建:从爬虫到标注的全流程指南 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 AI数据集构建:从爬虫到标注的全流程指南摘要引言流程图:数据集构建全生命周期一、数据采…

    飞算 JavaAI 赋能老项目重构:破旧立新的高效利器

    许多企业的 Java 老项目面临着代码陈旧、架构落后、维护困难等问题。老项目重构势在必行,却又因庞大的代码量、复杂的业务逻辑让开发团队望而却步。 老项目重构困境重重 传统的 Java 老项目往往在长期的迭代和维护中积累了诸多问题。一方面,代码质量堪…

    服装产品属性描述数据集(19197条),AI智能体知识库收集~

    今天再来分享一个关于服装产品属性描述数据集!可用户AI训练,AI智能体知识库! 一、数据集介绍 电商文案优化 / 属性智能识别 / 服装产品描述数据训练首选资源 1、数据规模: 共计 19197 条 2、文件格式: Excel格式 3、字…

    Java程序员学从0学AI(四)

    一、前言 在上一篇文章中,我们学习了SpringAI种的Advisor组件,这个是一个类似AOP的,用于增强大模型调用的组件。今天我们继续学习新的组件提示词:Prompts 二、Prompts 1、简介 提示词是我们和大模型交互的入口,我们…

    从 iPhone 备份照片: 保存iPhone图片的5种方法

    随着智能手机越来越融入我们的生活,我们的照片已成为我们设备上最有价值的数据形式之一。然而,iPhone内部存储空间仍然有限,因此我们需要将iPhone中的照片备份到另一个地方,以释放空间并确保珍贵的图像记忆的安全。阅读本指南&…

    AU3110 10W、7.5V至18V、无电感器、立体声D类扬声器放大器(替代TPA3110)

    1.特性 ● 输出功率 - 2 x 11W 12V,6Ω,THDN 1% - 2 x 15.5W 12V,4Ω,THDN 1% - 1 x 21W 12V,4Ω,THDN 1% - THDN< 0.04% 12V,6Ω,1W, 1kHz ● 供电电压范围 - 7.5V-18V 低导通阻抗 RDs(on):140mΩ ● 固定增益&#xff1a; - 26dB ● 低静态功耗 - > 90% Class D效率 ●…

    系统设计面试利器:The System Design Primer开源项目介绍

    引言 在当今软件工程领域&#xff0c;系统设计能力已经成为评判一名高级工程师技术水平的重要标准。无论是顶级科技公司的技术面试&#xff0c;还是实际工作中设计大规模分布式系统&#xff0c;掌握系统设计知识都是必不可少的技能。今天我们要深入探讨的是 GitHub 上一个备受…

    一周学会Pandas2之Python数据处理与分析-Pandas2数据绘图与可视化

    锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas 集成了 Matplotlib&#xff0c;提供了简单高效的绘图接口&#xff0c;使数据可视化变得直观便捷。本指南将详…

    Go语言快速入门(基础语法与面向对象OOP)

    文章目录 阅读前置条件golang环境安装golang特点第一个Go程序Go语言变量声明常量Golang多返回值的三种写法go函数import匿名与别名导包方式指针defer关键字结束(defer会在结束时调用&#xff0c;类似Java的finally)slice切片数组与动态数组的定义动态数组与切片的四种声明方式s…

    用AI(Deepseek)做了配色网站-功能介绍【欢迎体验】

    前言 前面分享了一篇文章&#xff1a;关于用AI做了一个配色网站&#xff0c;并讲了如何“结合AI开发想法”实现作品。 以下是文章链接&#xff1a; 一天时间&#xff0c;我用AI(DeepSeek)做了一个配色网站 当时为第一版本&#xff0c;网站的很多功能和细节还有很多完善的地方…

    【2025年B卷】OD-100分-斗地主之顺子

    专栏订阅🔗 -> 赠送OJ在线评测 斗地主之顺子 问题描述 卢小姐喜欢玩斗地主扑克牌游戏。在这个游戏中,扑克牌由小到大的顺序为:3、4、5、6、7、8、9、10、J、Q、K、A、2。玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等多种组合。 顺子是一种常见的出牌方…

    题山采玉: Day1

    嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

    优化 Transformer 模型:基于知识蒸馏、量化技术及 ONNX

    Transformer 模型非常强大&#xff0c;但往往太大太慢&#xff0c;不适合实时应用。为了解决这个问题&#xff0c;我们来看看三种关键的优化技术&#xff1a;知识蒸馏、量化和ONNX 图优化。这些技术可以显著减少推理时间和内存使用。 为了说明每种技术的利弊&#xff0c;我们以…

    C++实现图形化2048小游戏

    目录 一、游戏规则二、步骤实现(一) SDL库的安装(二) 初始化游戏界面1. 后台数字模型2 显示模型2.1 SDL库的使用2.1.1 窗口渲染2.1.2 矩形绘制 2.2 SDL-ttf库的使用2.2.1 设置字体属性2.2.2 创建纹理图层2.2.3 绘制文字 (三) 随机生成2个数字&#xff08;2或4&#xff09;(四) …

    Halcon光度立体法

    1、光度立体法&#xff0c;可用于将对象的三维形状与其二维纹理&#xff08;例如打印图像&#xff09;分离。需要用不同方向而且已知照明方向的多个光源&#xff0c;拍摄同一物体的至少三张图像。请注意&#xff0c;所有图像的相机视角必须相同。 物体的三维形状主要被计算为三…

    北方局地40℃又来了 干热烤验来临

    天气即将变热,南北方的高温特点各不相同。北方是干热型高温,南方则是闷热型高温。全国大部分地区降水稀少,仅局部有雨。从今天夜间到后两天,降水预报图上将出现大片无降水区域,雨水不再是天气舞台的主要角色。气温成为焦点,南北方30℃以上的高温将连成一片,部分地区还将…

    【后端架构师的发展路线】

    后端架构师的发展路线是从基础开发到技术领导的系统性进阶过程&#xff0c;需融合技术深度、架构思维和业务洞察力。以下是基于行业实践的职业发展路径和关键能力模型&#xff1a; 一、职业发展阶梯‌ 初级工程师&#xff08;1-3年&#xff09;‌ 核心能力‌&#xff1a;掌…

    Python爬虫监控程序设计思路

    最近因为爬虫程序太多&#xff0c;想要为Python爬虫设计一个监控程序&#xff0c;主要功能包括一下几种&#xff1a; 1、监控爬虫的运行状态&#xff08;是否在运行、运行时间等&#xff09; 2、监控爬虫的性能&#xff08;如请求频率、响应时间、错误率等&#xff09; 3、资…

    [手写系列]从0到1开发并上线Edge浏览器插件

    [手写系列]从0到1开发并上线Edge浏览器插件 一、实战开发 我们将从0到1创建一个实用的"页面分析助手"插件&#xff0c;它可以显示当前页面的字数统计、阅读时间和主要关键词。 官方插件文档链接&#xff1a;https://learn.microsoft.com/zh-cn/microsoft-edge/exten…

    归一化还是标准化?如何为你的数据选择最佳缩放方法

    为什么你的模型需要"身高均等"&#xff1f; 想象一下&#xff0c;如果你在篮球队里同时安排了姚明&#xff08;2.29米&#xff09;和"小土豆"姜山&#xff08;1.65米&#xff09;一起打球&#xff0c;结果会怎样&#xff1f;显然&#xff0c;姚明会"…