当前位置: 首页 > article >正文

【Java 基础】-- ArrayList 和 Linkedlist

目录

1. Java 中的 ArrayList 和 LinkedList 简介

ArrayList

LinkedList

2. 相同数量级下的内存开销对比

ArrayList 的内存开销

LinkedList 的内存开销

3. 它们的速度对比

总结


1. Java 中的 ArrayList 和 LinkedList 简介

ArrayList
  • 数据结构:基于动态数组实现。
  • 特点
    • 元素按索引存储,随机访问效率高(时间复杂度 O(1)O(1)O(1))。
    • 动态扩容机制,扩容时会重新分配更大的数组,并将旧数组中的元素复制过去。
    • 插入或删除时,若非在末尾操作,需要移动大量元素(时间复杂度最差为 O(n)O(n)O(n))。
  • 适用场景:频繁读取或操作末尾元素的场景。
LinkedList
  • 数据结构:基于双向链表实现。
  • 特点
    • 每个节点存储数据及前后节点的引用。
    • 插入或删除元素时,只需调整引用,效率较高(时间复杂度 O(1)O(1)O(1) 对于给定节点位置)。
    • 访问元素时需要从头/尾节点开始遍历(时间复杂度 O(n)O(n)O(n))。
  • 适用场景:频繁插入或删除中间元素的场景。

2. 相同数量级下的内存开销对比

ArrayList 的内存开销
  • 存储元素的连续内存块 + 数组的额外空间(动态扩容时)。
  • 每个元素仅占用对象引用的大小(通常是 4 字节或 8 字节,具体取决于 JVM 配置)。
  • 动态数组可能浪费一定空间(未使用的容量)。
LinkedList 的内存开销
  • 每个节点需要存储数据及两个引用(前驱节点和后继节点)。
  • 除了数据本身,还需要额外的内存开销来存储这些引用。
  • 内存占用大幅高于 ArrayList。

在相同数量级下,LinkedList 的内存开销明显高于 ArrayList,尤其在存储大量元素时。


3. 它们的速度对比

操作ArrayListLinkedList
随机访问O(1)O(1)O(1):直接通过索引访问。O(n)O(n)O(n):需要逐个遍历节点。
插入(中间位置)O(n)O(n)O(n):需要移动元素。O(1)O(1)O(1):只需调整引用(需定位节点)。
插入(末尾)O(1)O(1)O(1):动态扩容后开销较高。O(1)O(1)O(1):无需额外操作。
删除(中间位置)O(n)O(n)O(n):需要移动元素。O(1)O(1)O(1):只需调整引用(需定位节点)。
删除(末尾)O(1)O(1)O(1):直接移除尾部元素。O(1)O(1)O(1):直接移除尾节点。

总结

  1. 内存开销

    • LinkedList 更高,因为每个节点需要额外的引用存储。
    • ArrayList 更节省内存。
  2. 性能

    • ArrayList 适合频繁随机访问、追加元素。
    • LinkedList 更适合频繁的中间插入和删除操作。

综合考虑内存和速度,多数场景下更推荐使用 ArrayList,除非有明确的需求(如频繁中间插入/删除)。


http://www.kler.cn/a/451715.html

相关文章:

  • 【Linux】进程间通信 -> 匿名管道命名管道
  • Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
  • openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接
  • 由于这些关键原因,我总是手边有一台虚拟机
  • 如何打造用户友好的维护页面:6个创意提升WordPress网站体验
  • Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)
  • 总结一下数据结构 树 的种类
  • 安卓音频之dumpsys audio
  • 容器技术所涉及Linux内核关键技术
  • Linux(Centos 7.6)yum源配置
  • 全国硕士研究生入学考试(考研)择校择专业之择专业主要因素
  • StableAnimator模型的部署:复旦微软提出可实现高质量和高保真的ID一致性人类视频生成
  • 【漏洞复现】CVE-2015-3337 Arbitrary File Reading
  • 在vscode的ESP-IDF中使用自定义组件
  • AIDD - 人工智能药物设计 - 用于早期识别细胞毒性化合物的ML工具
  • React Props 完整使用指南
  • ffmpeg之显示一个yuv照片
  • 我的2024创作纪念日---新的一年,要有新的开始!
  • JOGL 从入门到精通:开启 Java 3D 图形编程之旅
  • 知迟图谱推理新进展
  • electron-vite【实战系列教程】
  • 划分网段(网络)
  • 数据分析-50-客户价值分析-用Python实现RFM模型
  • 对象、函数、原型之间的关系
  • 安装origin2025试用版(学生)
  • XlDynamicFilterCriteria 枚举 (Excel)