Java 中 ArrayList 和 LinkedList 的区别及使用场景

news/2025/2/26 6:57:12

文章目录

  • Java 中 ArrayList 和 LinkedList 的区别及使用场景
    • 1. 底层数据结构
      • ArrayList
      • LinkedList
    • 2. 性能对比
      • 2.1 访问元素(随机访问)
      • 2.2 插入和删除元素
      • 2.3 内存占用
    • 3. 使用场景
      • 适合使用 ArrayList 的场景
      • 适合使用 LinkedList 的场景
    • 4. 代码示例
      • ArrayList 示例
      • LinkedList 示例
    • 5. 总结


Java 中 ArrayList 和 LinkedList 的区别及使用场景

在 Java 中,ArrayListLinkedList 是两种常用的集合类,它们都实现了 List 接口,但在底层实现、性能特点以及适用场景上有显著区别。本文将详细分析它们的区别,并探讨如何在实际开发中选择合适的集合类。


1. 底层数据结构

ArrayList

  • 底层实现ArrayList 是基于动态数组实现的。它内部使用一个数组来存储元素,当数组容量不足时,会自动进行扩容(通常是当前容量的 1.5 倍)。
  • 特点
    • 内存空间连续,支持快速随机访问。
    • 插入和删除操作效率较低,尤其是在列表中间或头部操作时,需要移动大量元素。

LinkedList

  • 底层实现LinkedList 是基于双向链表实现的。每个元素(节点)都包含数据以及指向前后节点的引用。
  • 特点
    • 内存空间不连续,访问元素需要从头或尾遍历。
    • 插入和删除操作效率高,尤其是在列表中间或头部操作时,只需要修改节点的引用。

2. 性能对比

2.1 访问元素(随机访问)

  • ArrayList
    • 由于底层是数组,可以通过索引直接访问元素,时间复杂度为 O(1)
    • 适合频繁读取数据的场景。
  • LinkedList
    • 需要从头或尾遍历链表,时间复杂度为 O(n)
    • 随机访问性能较差。

2.2 插入和删除元素

  • ArrayList
    • 在列表末尾插入或删除元素的时间复杂度为 O(1)
    • 在列表中间或头部插入或删除元素时,需要移动后续元素,时间复杂度为 O(n)
  • LinkedList
    • 在任意位置插入或删除元素的时间复杂度为 O(1)(前提是已经定位到插入或删除的位置)。
    • 适合频繁插入和删除的场景。

2.3 内存占用

  • ArrayList
    • 内存占用较少,因为只需要存储元素数据和数组容量。
    • 但在扩容时可能会浪费一些空间。
  • LinkedList
    • 每个元素都需要额外的空间存储前后节点的引用,因此内存占用较高。

3. 使用场景

适合使用 ArrayList 的场景

  1. 频繁读取数据:例如需要根据索引快速访问元素。
  2. 数据量较小或变化不大:避免频繁扩容带来的性能开销。
  3. 需要节省内存ArrayList 的内存占用比 LinkedList 更少。

适合使用 LinkedList 的场景

  1. 频繁插入和删除数据:例如实现队列、栈或需要频繁修改列表结构的场景。
  2. 不需要随机访问:如果主要操作是遍历或修改列表,而不是通过索引访问元素。
  3. 实现特殊数据结构:例如双向队列(Deque),LinkedList 实现了 Deque 接口,可以方便地实现队列和栈。

4. 代码示例

ArrayList 示例

java">import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("A"); // 添加到末尾
        list.add(0, "B"); // 添加到头部
        System.out.println(list.get(1)); // 访问元素
        list.remove(0); // 删除元素
        System.out.println(list);
    }
}

LinkedList 示例

java">import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("A"); // 添加到末尾
        list.addFirst("B"); // 添加到头部
        System.out.println(list.get(1)); // 访问元素
        list.removeFirst(); // 删除头部元素
        System.out.println(list);
    }
}

5. 总结

特性ArrayListLinkedList
底层数据结构动态数组双向链表
随机访问性能O(1)O(n)
插入/删除性能O(n)(中间或头部)O(1)(已知位置)
内存占用较少较多
适用场景频繁读取、数据量固定频繁插入/删除、实现队列/栈

在实际开发中,应根据具体需求选择合适的集合类:

  • 如果需要频繁访问元素且数据量变化不大,优先选择 ArrayList
  • 如果需要频繁插入和删除元素,或者需要实现队列、栈等数据结构,优先选择 LinkedList

希望本文能帮助你更好地理解 ArrayListLinkedList 的区别,并在实际开发中做出更合适的选择!


http://www.niftyadmin.cn/n/5868262.html

相关文章

Apache Doris 索引的全面剖析与使用指南

搞大数据开发的都知道&#xff0c;想要在海量数据里快速查数据&#xff0c;就像在星图里找一颗特定的星星&#xff0c;贼费劲。不过别慌&#xff0c;数据库索引就是咱们的 “定位神器”&#xff0c;能让查询效率直接起飞&#xff01;就拿 Apache Doris 这个超火的分析型数据库来…

leetcode刷题记录(一百二十二)——46. 全排列

&#xff08;一&#xff09;问题描述 51. N 皇后 - 力扣&#xff08;LeetCode&#xff09;51. N 皇后 - 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后…

Ubuntu系统创建mariadb数据库(mysql),开通局域网络内连接

Ubuntu系统创建mariadb数据库&#xff08;mysql),开通局域网络内连接 1、安装数据库 如果你确定系统中没有安装 mariadb&#xff0c;可以使用以下命令进行安装&#xff1a; sudo apt update sudo apt install mariadb-server -y如果你只想安装客户端&#xff0c;可以使用以下…

C++ Primer 算法概述

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

MongoDB面试宝典【刷题系列】

文章目录 1、MySQL与MongoDB之间最基本的差别是什么?2、MongoDB成为最好NoSQL数据库的原因是什么?3、分析器在MongoDB中的作用是什么?4、如果用户移除对象的属性&#xff0c;该属性是否从存储层中删除?5、更新操作立刻fsync到磁盘?6、什么是master或primary?7、 数据在什…

利用go-migrate实现MySQL和ClickHouse的数据库迁移

1. 背景 在使用gorm时 , 尽管已经有了自动建表和钩子函数 . 但是在面临希望了解到数据库的变更 , 和插入一些系统字段时 , 以及最关键的数据库迁移的工作 . gorm显得稍微有点不便 . 在了解到migrate这项技术后 , 就使用go-migrate开发了一个可以迁移MySQL和ClickHouse数据库的…

Sqlserver安全篇之_隐藏实例功能和禁用SQL Server Browser服务

总结&#xff1a; 1、隐藏实例功能和禁用SQL Server Browser服务的功能一样&#xff0c;对应非默认实例(且这个默认实例是1433端口)的情况下&#xff0c;都是需要在连接字符串中提供端口号才能连接到实例 2、隐藏实例功能后&#xff0c;就算开启了SQL Server Browser服务&#…

JVM生产环境问题定位与解决实战(三):揭秘Java飞行记录器(JFR)的强大功能

提到飞行记录器&#xff0c;或许你的脑海中并未立刻浮现出清晰的画面&#xff0c;但一说起“黑匣子”&#xff0c;想必大多数人都能恍然大悟&#xff0c;知晓其重要性及用途。在航空领域&#xff0c;黑匣子作为不可或缺的设备&#xff0c;默默记录着飞行过程中的每一项关键数据…