面试官:ArrayList和LinkedList在性能方面的差别,能有多大?

ArrayList与LinkedList底层原理:从扩容到fail-fast的List面试全解析 在Java集合框架中,List是最基础也最常被问到的数据结构之一。无论是ArrayList的数组扩容机制,还是LinkedList的双向链表结构,背后都涉及内存布局、时间复杂度与工程取舍的深层原理。理解这些底层行为,不仅能解释为什么ArrayList随机访问快而LinkedList插入删除未必更快,还能理解fail-fast机制在迭代遍历中的代价与意义。从数据结构基础到JVM内存模型,再到并发场景下的线程安全选型,List相关技术广泛应用于日常开发、性能优化与大厂面试。掌握扩容因子为何是1.5、subLis 阅读详情

前言

在面试的时候,经常会被问到几个问题:

ArrayList和LinkedList的区别,相信大部分朋友都能回答上:

ArrayList是基于数组实现,LinkedList是基于链表实现 当随机访问List时,ArrayList比LinkedList的效率更高,等等

当被问到ArrayList和LinkedList的使用场景是什么时,大部分朋友的答案可能是:

ArrayList和LinkedList在新增、删除元素时,LinkedList的效率要高于 ArrayList,而在遍历的时候,ArrayList的效率要高于LinkedList

那这个回答是否准确呢?今天我们就来研究研究!

01 源码分析

1.1 ArrayList

实现类

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable1.2.

ArrayList实现了List接口,继承了AbstractList抽象类,底层是数组实现的,并且实现了自增扩容数组大小。

ArrayList还实现了Cloneable接口和Serializable接口,所以他可以实现克隆和序列化。

ArrayList还实现了RandomAccess接口,这个接口是一个标志接口,它标志着“只要实现该接口的List类,都能实现快速随机访问”。

基本属性

ArrayList属性主要由数组长度size、对象数组elementData、初始化容量default_capacity等组成, 其中初始化容量默认大小为10。

//默认初始化容量
private static final int DEFAULT_CAPACITY = 10;
//对象数组
transient Object[] elementData; 
//数组长度
private int size;1.2.3.4.5.6.

从ArrayList属性来看,elementData被关键字transient修饰了,transient关键字修饰该字段则表示该属性不会被序列化。

但ArrayList其实是实现了序列化接口,这是为什么呢?

由于ArrayList的数组是基于动态扩增的,所以并不是所有被分配的内存空间都存储了数据。

如果采用外部序列化法实现数组的序列化,会序列化整个数组,ArrayList为了避免这些没有存储数据的内存空间被序列化,内部提供了两个私有方法writeObject以及readObject来自我完成序列化与反序列化,从而在序列化与反序列化数组时节省了空间和时间。

因此使用transient修饰数组,是防止对象数组被其他外部方法序列化。

ArrayList自定义序列化方法如下:

初始化

有三种初始化办法:无参数直接初始化、指定大小初始化、指定初始数据初始化,源码如下:

当ArrayList新增元素时,如果所存储的元素已经超过其已有大小,它会计算元素大小后再进行动态扩容,数组的扩容会导致整个数组进行一次内存复制。

因此,我们在初始化ArrayList时,可以通过第一个构造函数合理指定数组初始大小,这样有助于减少数组的扩容次数,从而提高系统性能。

ArrayList 无参构造器初始化时,默认大小是空数组,并不是大家常说的 10,10 是在第一次 add 的时候扩容的数组值。

新增元素

ArrayList新增元素的方法有两种,一种是直接将元素加到数组的末尾,另外一种是添加元素到任意位置。

 public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }

两个方法的相同之处是在添加元素之前,都会先确认容量大小,如果容量够大,就不用进行扩容;如果容量不够大,就会按照原来数组的1.5倍大小进行扩容,在扩容之后需要将数组复制到新分配的内存地址。

下面是具体的源码:

这两个方法也有不同之处,添加元素到任意位置,会导致在该位置后的所有元素都需要重新排列,而将元素添加到数组的末尾,在没有发生扩容的前提下,是不会有元素复制排序过程的。

所以ArrayList在大量新增元素的场景下效率不一定就很慢的

如果我们在初始化时就比较清楚存储数据的大小,就可以在ArrayList初始化时指定数组容量大小,并且在添加元素时,只在数组末尾添加元素,那么ArrayList在大量新增元素的场景下,性能并不会变差,反而比其他List集合的性能要好。

删除元素

ArrayList 删除元素有很多种方式,比如根据数组索引删除、根据值删除或批量删除等等,原理和思路都差不多。

ArrayList在每一次有效的删除元素操作之后,都要进行数组的重组,并且删除的元素位置越靠前,数组重组的开销就越大。

我们选取根据值删除方式来进行源码说明:

遍历元素

由于ArrayList是基于数组实现的,所以在获取元素的时候是非常快捷的。

public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

    E elementData(int index) {
        return (E) elementData[index];
    }

1.2 LinkedList

LinkedList是基于双向链表数据结构实现的。

这个双向链表结构,链表中的每个节点都可以向前或者向后追溯,有几个概念如下:

  • 链表每个节点我们叫做 Node,Node 有 prev 属性,代表前一个节点的位置,next 属性,代表后一个节点的位置;
  • first 是双向链表的头节点,它的前一个节点是 null。
  • last 是双向链表的尾节点,它的后一个节点是 null;
  • 当链表中没有数据时,first 和 last 是同一个节点,前后指向都是 null;
  • 因为是个双向链表,只要机器内存足够强大,是没有大小限制的。

Node结构中包含了3个部分:元素内容item、前指针prev以及后指针next,代码如下。

private static class Node<E> {
    E item;// 节点值
    Node<E> next; // 指向的下一个节点
    Node<E> prev; // 指向的前一个节点

    // 初始化参数顺序分别是:前一个节点、本身节点值、后一个节点
    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

LinkedList就是由Node结构对象连接而成的一个双向链表。

实现类

LinkedList类实现了List接口、Deque接口,同时继承了AbstractSequentialList抽象类,LinkedList既实现了List类型又有Queue类型的特点;LinkedList也实现了Cloneable和Serializable接口,同ArrayList一样,可以实现克隆和序列化。

由于LinkedList存储数据的内存地址是不连续的,而是通过指针来定位不连续地址,因此,LinkedList不支持随机快速访问,LinkedList也就不能实现RandomAccess接口。

public class LinkedList
    extends AbstractSequentialList
    implements List, Deque, Cloneable, java.io.Serializable

基本属性

transient int size = 0;
transient Node first;
transient Node last;

我们可以看到这三个属性都被transient修饰了,原因很简单,我们在序列化的时候不会只对头尾进行序列化,所以LinkedList也是自行实现readObject和writeObject进行序列化与反序列化。

下面是LinkedList自定义序列化的方法。

节点查询

链表查询某一个节点是比较慢的,需要挨个循环查找才行,我们看看 LinkedList 的源码是如何寻找节点的:

LinkedList 并没有采用从头循环到尾的做法,而是采取了简单二分法,首先看看 index 是在链表的前半部分,还是后半部分。

如果是前半部分,就从头开始寻找,反之亦然。通过这种方式,使循环的次数至少降低了一半,提高了查找的性能。

新增元素

LinkedList添加元素的实现很简洁,但添加的方式却有很多种。

默认的add (Ee)方法是将添加的元素加到队尾,首先是将last元素置换到临时变量中,生成一个新的Node节点对象,然后将last引用指向新节点对象,之前的last对象的前指针指向新节点对象。

LinkedList也有添加元素到任意位置的方法,如果我们是将元素添加到任意两个元素的中间位置,添加元素操作只会改变前后元素的前后指针,指针将会指向添加的新元素,所以相比ArrayList的添加操作来说,LinkedList的性能优势明显。

删除元素

在LinkedList删除元素的操作中,我们首先要通过循环找到要删除的元素,如果要删除的位置处于List的前半段,就从前往后找;若其位置处于后半段,就从后往前找。

这样做的话,无论要删除较为靠前或较为靠后的元素都是非常高效的,但如果List拥有大量元素,移除的元素又在List的中间段,那效率相对来说会很低。

遍历元素

LinkedList的获取元素操作实现跟LinkedList的删除元素操作基本类似,通过分前后半段来循环查找到对应的元素,但是通过这种方式来查询元素是非常低效的,特别是在for循环遍历的情况下,每一次循环都会去遍历半个List。

所以在LinkedList循环遍历时,我们可以使用iterator方式迭代循环,直接拿到我们的元素,而不需要通过循环查找List。

02 分析测试

新增元素操作性能测试

测试用例源代码:

  • ArrayList:paste.ubuntu.com/p/gktBvjgMGk
  • LinkedList:paste.ubuntu.com/p/3jQrY2XMPr

测试结果:

通过这组测试,我们可以知道LinkedList添加元素的效率未必要高于ArrayList。

从集合头部位置添加元素

由于ArrayList是数组实现的,在添加元素到数组头部的时候,需要对头部以后的数据进行复制重排,所以效率很低;

LinkedList是基于链表实现,在添加元素的时候,首先会通过循环查找到添加元素的位置,如果要添加的位置处于List的前半段,就从前往后找;若其位置处于后半段,就从后往前找,因此LinkedList添加元素到头部是非常高效的。

从集合中间位置位置添加元素

ArrayList在添加元素到数组中间时,同样有部分数据需要复制重排,效率也不是很高;

LinkedList将元素添加到中间位置,是添加元素最低效率的,因为靠近中间位置,在添加元素之前的循环查找是遍历元素最多的操作。

从集合尾部位置添加元素

而在添加元素到尾部的操作中,在没有扩容的情况下,ArrayList的效率要高于LinkedList。

这是因为ArrayList在添加元素到尾部的时候,不需要复制重排数据,效率非常高。

LinkedList虽然也不用循环查找元素,但LinkedList中多了new对象以及变换指针指向对象的过程,所以效率要低于ArrayList。

注意:这是排除动态扩容数组容量的情况下进行的测试,如果有动态扩容的情况,ArrayList的效率也会降低。

删除元素操作性能测试

ArrayList和LinkedList删除元素操作测试的结果和添加元素操作测试的结果很接近!

结论: 如果需要在List的头部进行大量的插入、删除操作,那么直接选择LinkedList。否则,ArrayList即可。

遍历元素操作性能测试

测试用例源代码:

  • ArrayList:paste.ubuntu.com/p/ZNWc9H2pYm
  • LinkedList:paste.ubuntu.com/p/xSk4nHDHvN

测试结果:

我们可以看到,LinkedList的for循环性能是最差的,而ArrayList的for循环性能是最好的。

这是因为LinkedList基于链表实现的,在使用for循环的时候,每一次for循环都会去遍历半个List,所以严重影响了遍历的效率;ArrayList则是基于数组实现的,并且实现了RandomAccess接口标志,意味着ArrayList可以实现快速随机访问,所以for循环效率非常高。

LinkedList的迭代循环遍历和ArrayList的迭代循环遍历性能相当,也不会太差,所以在遍历LinkedList时,我们要切忌使用for循环遍历。

Java LinkedList源码深度解析:从双向链表底层实现到迭代器原理与性能选型 在Java集合框架中,链表是最基础也最常被问到的数据结构之一。双向链表不同于数组的连续存储,每个节点通过前后指针串联,支持O(1)的头尾插入与删除,这正是Deque双端队列的底层基石。LinkedList正是基于这一原理实现的List与Deque双重容器,其源码揭示了节点管理、迭代器fail-fast机制以及modCount计数器的设计智慧。理解这些原理,不仅有助于应对Java面试中的高频问题,也能指导实际开发中的数据结构选型:例如在消息缓冲、LRU缓存等频繁首尾操作的场景中,LinkedList具有独特价 阅读详情

相关推荐

嵌入式软件面试常见问题及答案

干了多年的嵌入式,被面试过,也面过不少新人,下面这些是面试中很常见的一些问题及答案,答案可以根据自己的经验自己思考下。--持续补充并更新

weixin_37553721的博客 6027

别再背八股:ArrayList与LinkedList源码级剖析与实战避坑指南

Java集合框架中的List接口是日常开发最常用的数据结构之一,而ArrayList与LinkedList的底层实现差异、扩容机制以及迭代器行为,直接影响着系统性能与稳定性。理解数组连续内存与链表节点分散的内存模型,能解释为何随机访问、增删操作的真实复杂度与直觉不同。ArrayList基于动态数组,通过grow()实现1.5倍扩容;LinkedList基于双向链表,在持有节点引用时才具备O(1)插入优势。同时,modCount与fail-fast机制保证了遍历时对并发修改的快速失败,而CopyOnWrite

weixin_34075268的博客 440

CubeMX实战:ETH+LWIP+FreeRTOS网络工程从零搭建与AC6编译优化

本文手把手教你使用STM32CubeMX从零搭建集成以太网(ETH)、LWIP协议栈和FreeRTOS的嵌入式网络工程。文章详细解析了外设配置、协议栈调优、任务规划等关键步骤,并重点分享了如何解决ARM Compiler 6(AC6)的兼容性问题,实现编译速度与稳定性的双重提升,助你快速构建稳定的网络应用原型。

n2o3p4的博客 410

ArrayList和LinkedList使用不当,性能差距会如此之大!

前言在面试的时候,经常会被问到几个问题:ArrayList和LinkedList的区别,相信大部分朋友都能回答上:ArrayList是基于数组实现,LinkedList是基于链表实现当随机...

HollisChuang's Blog 698

群晖Hyper Backup还原实战:加密与非加密备份的完整操作指南

本文详细介绍了群晖Hyper Backup在加密与非加密备份场景下的完整还原操作指南。通过实战案例和高级技巧,帮助用户应对硬盘故障或系统崩溃时的数据恢复挑战,特别是加密备份恢复中的关键节点和常见陷阱。

weixin_29323365的博客 445

优快云 2

2

qq_62260432的博客 5237

接口

接口 1.接口的概述 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。 Java中的接口更多的体现在对行为的抽象! 2.接口的特点 接口用关键字interface修饰 public interface 接口名 {} 类实现接口用implements表示 public class 类名 implements 接口名 {} 接口不能实例化 接口如何实例化...

熊猫拿铁 245

在 SAP BTP 中为 SAP AI Core 创建 Service Instance 和 Service Key 的完整实战指南

摘要:本文详细介绍了在SAP BTP上创建AI Core服务实例和密钥的关键步骤,这是实现ABAP系统与Gen AI大语言模型集成的核心技术环节。文章通过一个制造业财务问答场景的案例,系统梳理了从前提条件准备、架构理解到具体操作的全过程,重点解析了service instance创建、X.509证书配置等关键节点。特别强调了Extended计划选择、证书格式等易错点,为ABAP开发人员实现Gen AI场景提供了实用指南。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

ArrayList和LinkedList的几种循环遍历方式及性能对比分析

Originate From:http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论。 通过本文你可以了解(1)Li

shuhuai007的专栏 1817

点云语义分割:RandLANet模型推理C++部署(2)

一、数据读取及预处理 二、模型推理 三、结果保存

zhaoguanhua的博客 3801

推理引擎终极对决:TensorRT vs ONNX Runtime,YOLOv8速度差30%的核心原因与实操指南

若你使用NVIDIA GPU,且追求极致速度和低延迟,TensorRT是唯一选择,尤其是边缘设备和实时场景;若你需要跨硬件部署、快速验证原型,或预算有限(无需NVIDIA GPU),ONNX Runtime是性价比之王;对于YOLOv8这类检测模型,TensorRT的FP16/INT8量化是“免费的速度提升”,建议优先采用。最后提醒:推理引擎的优化是“细节决定成败”——同样的引擎,不同的预处理方式、显存配置、批大小,都会导致10%-20%的性能差异。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1027

【Java面试】ArrayList、LinkedList 查找数据哪个快

ArrayList、LinkedList查找数据哪个快?这里有几种不同情况1、是不是有序的?2、还是调用的contains(o)方法?ArrayList 因为是基于数组实现,所以可以随机访问,时间复杂度是O(1);LinkedList 因为是基于链表实现,所以只能从头到尾遍历,时间复杂度是O(n);从理论上看是一样快,但是你可能忽略了

狗尾巴草也开花的博客 3212

【WorkBuddy专栏14】专家不是「换皮」——角色切换、训练机制与自我进化深度拆解

WorkBuddy专栏14】专家不是「换皮」——角色切换、训练机制与自我进化深度拆解

AI人人懂 594

详谈ArrayList和LinkedList的真正效率

说起ArrayList和LinkedList的效率,很多人都能说上如下图中的答案来: 该答案是搜索提供的推荐答案,也是很多人在初次去学习了解ArrayList和LinkedList区别时获得的答案。但这个答案真的正确吗?效率如何,我们从源码分析,然后再做测试看看。 我们今天着重研究一下add的效率。首先我们从源码来看看: 先看ArrayList的add方法: 如图,add方法中,先进行越界检查、然后再进行检查扩容工作、元素迁移,之后再赋值,把size属性++。 然后再看看LinkedList的add方法:

hening191的博客 3066

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

面试官问:ArrayList和LinkedList有什么区别?(附图解+比喻+避坑指南)

摘要:ArrayList基于动态数组(连续内存,O(1)随机访问),LinkedList基于双向链表(离散节点,头尾操作O(1))。本文用“高铁 vs 自行车队”比喻 + 源码级对比 + 时间复杂度全景表 + CPU缓存分析 + 5道面试官追问,彻底讲透这道Java集合必考题。一句话:查多改少用ArrayList,频繁头尾操作考虑LinkedList,中间插入两者都是O(n)。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 347

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java中LinkedList和ArrayList的区别

首先亮一下他们两个基本区别,面试的时候可以用来和面试官唠嗑啊 1、ArrayList实现了基本动态数组结构,Linked基于链表的结构。链表?什么是链表?答:“链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中指针连接次序实现的”注:此句话通过了科普中国百科科学词条编写与应用工作项目的审核。 2、对于get和set,ArrayList的性能优于LinkedList,

路漫漫,水迢迢 2565

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

ArrayList LinkedList vector的区别?

面试官问你的时候,你怼他一句,工程里面用的都是ArrayList,剩下的两个,我全局搜索就没见到过,问着有意思吗。下面说这三个的差别。1.LinkedList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.不同步(就是线程不安全)      同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个...

duanyuwan的博客 251

集合ArrayList,LinkedList,Vector的区别

集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap 首先,上面这东西是很必要存在和记住的。不然这个集合老是没完没了的忘。这个级别关系应该可以看得懂吧,没必要非得给你画个图才明白吧。 面试官问你

xuehentian的博客 180

Java集合框架面试核心:从ArrayList到ConcurrentHashMap

数据结构是编程的基石,而Java集合框架正是这一思想在工程中的经典实现。理解其设计原理,如接口分层、哈希散列与并发控制,能显著提升代码的健壮性和性能。HashMap作为核心组件,其2的幂次容量、负载因子0.75以及链表转红黑树的阈值,均体现了时间与空间的精妙权衡;HashSet的去重能力则建立在equals与hashCode的契约之上。在多线程场景下,ConcurrentHashMap通过CAS和synchronized实现高效并发读,替代了JDK 7的分段锁。这些底层逻辑不仅面试高频,更直接应用于数据去重

weixin_29913663的博客 220

Java链表与LinkedList:从源码到面试算法题的全解析

链表是数据结构中最基础也最常被考察的存储结构,与数组的连续内存不同,它通过节点间的指针引用实现离散存储,从而在插入和删除操作上具备天然优势。理解链表的底层原理,不仅能帮你读懂 LinkedList 的 JDK 源码,还能让你明白为什么它在某些场景下反而比 ArrayList 更慢。从单链表、双链表到循环链表,从反转、快慢指针到 LRU 缓存,链表都是这些高级实现的地基。本文结合源码拆解、手写实操和面试真题,系统梳理链表的核心机制、常见算法与性能陷阱,并给出 ArrayList 与 LinkedList 的选

weixin_29305313的博客 312

List接口的实现类---ArrayList、LinkedList、Vector之间的区别--------(java复习)

集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap 首先,上面这东西是很必要存在和记住的。不然这个集合老是没完没了的忘。这个级别关系应该可以看得懂吧,没必要非得给你画个图才明白吧。 下面说这三个的差别

请叫我大师兄 1万+

Java List家族精髓:20道面试题从源码到实战全面掌握ArrayList与LinkedList

Java集合框架中的List是日常开发与面试中的高频主角,而ArrayList与LinkedList更是绕不开的核心实现。理解List的有序性、重复性及不同底层结构(动态数组、双向链表)背后的原理,是写出高性能代码的前提。例如ArrayList的1.5倍扩容机制、LinkedList在头尾操作中的优势,以及Vector的线程安全与历史局限,都直接影响选型决策。在实际业务中,List的遍历、去重、排序、并发安全等问题也极易踩坑,如增强for循环中的fail-fast机制、subList视图的耦合陷阱等。本文系

weixin_29913663的博客 180

Java数据结构全解析:从ArrayList到HashMap与红黑树

数据结构是程序设计的基石,决定了数据的组织方式和操作效率。在Java生态中,从ArrayList的连续内存布局到LinkedList的节点引用,从HashMap的哈希冲突处理到红黑树的平衡策略,每个容器类都是经典数据结构的工业级实现。理解这些结构的时间复杂度、扩容机制和适用场景,不仅有助于写出高性能代码,更是Java面试中的核心考点。实际应用中,排行榜可用优先队列,缓存淘汰可用LinkedHashMap,前缀匹配可用Trie树。本内容以面试、源码与实战相结合的视角,系统梳理Java中最常用的数组、链表、栈队

weixin_33507732的博客 234

Java集合框架详解:Collection、Map与Collections的区别及工程实践

Java集合框架是日常开发中使用频率最高的基础组件,也是面试中绕不开的核心考点。很多初学者容易混淆Collection接口、Map接口与Collections工具类三者的定位——一个定义单列数据规范,一个定义键值对映射,一个提供操作集合的静态方法库。从底层数据结构看,ArrayList基于动态数组实现快速随机访问,HashMap借助数组+链表+红黑树实现高效键值存储,而Collections则通过面向接口编程为不同集合提供统一的排序、查找、不可变集合与线程安全包装能力。理解这些设计原理,不仅能应对面试中的高

weixin_34059951的博客 387

做美团面试官那几年,我了解到的面试的一些小内幕!

如果你觉得这些内容对你有帮助,可以扫码领取!!!!

2401_83601703的博客 760

ArrayList扩容机制深度解析:从懒加载到1.5倍扩容

ArrayList是Java开发中最常用的集合类之一,其底层基于Object数组实现动态扩容,而扩容机制直接关系到内存使用与程序性能。很多开发者只停留在`new ArrayList<>()`的表面用法,却忽略了背后的懒加载设计、容量计算与数组拷贝逻辑。本文从数组存储原理出发,剖析无参构造为何指向空数组、第一次add如何触发默认容量分配,以及grow方法中1.5倍扩容的工程取舍。理解这些底层细节,不仅能帮助规避循环添加时的性能陷阱,还能在数据量预估场景下合理使用`ensureCapacity`或带容量构造器进

weixin_33923762的博客 360
上一篇: 面试官:为什么Mybatis就能直接调用userMapper接口的方法?
下一篇: 实际应用中MySQL分库分表实践总结原理
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值