news 2026/6/22 21:26:50

ArrayList与LinkedList 实现对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArrayList与LinkedList 实现对比

JavaArrayListLinkedList:实现原理与性能对比

ArrayListLinkedList都实现了List接口,提供了有序的集合操作,但它们的底层数据结构和操作实现方式完全不同,因此在性能和使用场景上有很大差异。通过对比两者的实现,可以帮助我们在不同场景下做出更合适的选择。

1.ArrayListLinkedList的设计思想

ArrayListLinkedList都是List接口的实现类,但它们的设计思想和适用场景有所不同:

  • ArrayList
    • 基于动态数组实现,适合频繁访问元素的场景。
    • 底层存储是一个数组,访问元素的时间复杂度为O(1)
    • 插入和删除元素时可能需要移动数组中的元素,时间复杂度为O(n)
  • LinkedList
    • 基于双向链表实现,适合频繁插入和删除元素的场景。
    • 每个元素是一个节点,包含指向前后节点的引用。
    • 插入和删除元素时不需要移动其他元素,时间复杂度为O(1)
    • 访问元素时需要遍历链表,时间复杂度为O(n)

2.ArrayList源码实现

ArrayList底层基于数组实现,支持动态扩容。

初始化与扩容

  • ensureCapacity:用于判断当前数组的容量是否足够,如果不够则调用grow方法扩容。
  • grow:通过Arrays.copyOf创建一个更大的数组,并将原有数组的元素拷贝过去,扩容后的容量为原容量的1.5倍
示例代码:ArrayList扩容

java复制

private void ensureCapacityInternal(int minCapacity) { if (minCapacity > elementData.length) { grow(minCapacity); } } private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容为原容量的1.5倍 elementData = Arrays.copyOf(elementData, newCapacity); }

3.LinkedList源码实现

LinkedList底层基于双向链表实现,每个节点包含数据和指向前后节点的指针。

节点定义

java复制

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; } }

节点插入操作

  • linkLast:将新元素插入到链表的末尾。
  • 链表的头节点first和尾节点last用于维护链表的开始和结束。
示例代码:LinkedList插入

java复制

public void add(E e) { linkLast(e); } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; }

4. 添加元素的性能比较

ArrayList

  • 在末尾添加元素时,时间复杂度为O(1)
  • 如果数组满了,会进行扩容,扩容的时间复杂度为O(n)
添加流程
  1. add(E e)调用ensureCapacity()检查是否需要扩容。
  2. 如果不需要扩容,将元素添加到数组的最后一个位置,并增加size

LinkedList

  • 插入元素的时间复杂度为O(1),因为只需要修改前后节点的指针。
添加流程
  1. add(E e)调用linkLast(E e)方法,将元素插入到链表的尾部。
  2. 创建新节点并更新前后节点的指针,最后增加size

5. 查找元素的性能比较

ArrayList

  • 查找元素时,时间复杂度为O(1),直接通过索引访问数组元素。

LinkedList

  • 查找元素时,时间复杂度为O(n),需要从头到尾遍历链表。

6. 删除元素的性能比较

ArrayList

  • 删除元素时,删除位置之后的所有元素需要向前移动,时间复杂度为O(n)
删除流程

java复制

public boolean remove(Object o) { if (o == null) { for (int i = 0; i < size; i++) { if (elementData[i] == null) { fastRemove(i); // 调用fastRemove移除元素 return true; } } } else { for (int i = 0; i < size; i++) { if (o.equals(elementData[i])) { fastRemove(i); // 调用fastRemove移除元素 return true; } } } return false; }

LinkedList

  • 删除元素时,只需修改前后节点的指针,时间复杂度为O(1)
  • 但需要遍历链表找到要删除的节点,查找的时间复杂度为O(n)
删除流程

java复制

public E remove(int index) { checkElementIndex(index); // 索引越界检查 Node<E> x = node(index); // 找到要删除的节点 E element = x.item; unlink(x); // 移除节点 return element; } void unlink(Node<E> x) { final Node<E> next = x.next; final Node<E> prev = x.prev; if (prev == null) first = next; else prev.next = next; if (next == null) last = prev; else next.prev = prev; x.item = null; size--; }

7. 适用场景总结

ArrayList

  • 适用场景
    • 适合频繁访问元素的场景,尤其是需要随机访问时。
    • 在大量插入和删除操作时性能较差,因为需要移动数组元素。

LinkedList

  • 适用场景
    • 适合频繁插入和删除操作的场景,尤其是操作链表两端时。
    • 在大量访问元素时性能较差,因为需要逐个节点遍历。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 6:13:39

YOLOv13镜像常见问题全解,新手必看

YOLOv13镜像常见问题全解&#xff0c;新手必看 你刚拉取了YOLOv13官版镜像&#xff0c;执行docker run启动容器&#xff0c;却卡在环境激活环节&#xff1f; 输入conda activate yolov13提示“command not found”&#xff0c;或者运行预测脚本时爆出ModuleNotFoundError: No …

作者头像 李华
网站建设 2026/6/13 1:15:07

实测分享:用Unsloth在单卡上高效训练Qwen-14B

实测分享&#xff1a;用Unsloth在单卡上高效训练Qwen-14B 1. 为什么这次实测值得你花5分钟读完 你是否也遇到过这样的困境&#xff1a;想微调一个14B级别的大模型&#xff0c;但手头只有一张3090或4090——显存告急、训练慢得像加载网页、改个参数要等半小时&#xff1f;我试…

作者头像 李华
网站建设 2026/6/21 12:42:35

Qwen-Image-2512-ComfyUI打造个性化头像,效果超赞

Qwen-Image-2512-ComfyUI打造个性化头像&#xff0c;效果超赞 你有没有试过花半小时修图、换背景、调光影&#xff0c;就为了发一条朋友圈&#xff1f;或者反复改简历头像&#xff0c;却总觉得不够专业、不够有辨识度&#xff1f;现在&#xff0c;用阿里最新开源的Qwen-Image-…

作者头像 李华
网站建设 2026/6/19 11:42:47

如何突破视觉识别模型性能瓶颈:解密VOLO实战应用指南

如何突破视觉识别模型性能瓶颈&#xff1a;解密VOLO实战应用指南 【免费下载链接】volo 项目地址: https://gitcode.com/gh_mirrors/volo/volo 副标题&#xff1a;基于Outlook Attention机制的图像分类解决方案 | 深度学习开发者效率提升手册 视觉识别技术作为计算机视…

作者头像 李华
网站建设 2026/6/18 0:24:53

cv_resnet18 vs DBNet性能对比:谁更适合中文文本检测?

cv_resnet18 vs DBNet性能对比&#xff1a;谁更适合中文文本检测&#xff1f; 在实际OCR项目落地中&#xff0c;模型选型往往比调参更关键——一个轻量但鲁棒的检测器&#xff0c;可能比参数调到极致的重型模型更实用。尤其面对中文场景&#xff1a;文字方向多变、字体样式繁杂…

作者头像 李华
网站建设 2026/6/22 13:14:49

Flux与Z-Image-Turbo性能对比:9步推理谁更快?部署实测数据

Flux与Z-Image-Turbo性能对比&#xff1a;9步推理谁更快&#xff1f;部署实测数据 1. 开箱即用的文生图高性能环境 你有没有试过等一个模型下载30多GB权重&#xff0c;结果显存还爆了&#xff1f;或者调好环境发现跑不动1024分辨率&#xff1f;这次我们直接跳过所有折腾环节—…

作者头像 李华