Java List 集合介绍

一、List 集合概述

List 是 Java 集合框架中 有序、可重复 的接口,继承自 Collection,允许通过索引访问元素。其核心实现类包括 ArrayList、LinkedList 和 Vector,各有不同的底层结构和适用场景。

二、核心实现类详解

  1. ArrayList
  • 底层结构 :动态数组(Object[]),支持自动扩容。

  • 核心特性:

    • 访问效率 :按索引访问快(时间复杂度 O(1)),适合随机访问。
    • 增删效率 :尾部增删快(O(1)),中间增删慢(需移动元素,O(n))。
    • 线程安全 :非线程安全,多线程环境需手动同步(如 Collections.synchronizedList())。
    • 内存占用:较低(仅存储数据,无额外指针开销)。
  • 常用方法:

    复制代码
    ArrayList<String> list = new ArrayList<>();
    list.add("元素"); // 尾部添加
    list.add(1, "插入元素"); // 指定索引插入
    list.set(0, "替换元素"); // 替换指定索引元素
    list.get(0); // 获取索引元素
    list.remove(0); // 按索引删除
    list.remove("元素"); // 按值删除
    list.contains("元素"); // 判断是否包含
    list.size(); // 获取元素数量
    list.clear(); // 清空集合
  • 遍历方式:

    • 普通 for 循环(适合随机访问);
    • 增强 for 循环(简洁);
    • forEach 方法(Lambda 表达式)。
  • 适用场景:大量读操作、随机访问频繁,元素增删较少的场景(如数据展示、查询结果存储)。

  1. LinkedList
  • 底层结构:双向链表,每个节点存储数据及前后节点引用。

  • 核心特性:

    • 访问效率 :按索引访问慢(需遍历链表,O(n)),不适合随机访问。
    • 增删效率 :首尾增删快(O(1)),中间增删只需修改指针(O(n),主要耗时在遍历定位)。
    • 线程安全:非线程安全。
    • 内存占用:较高(需额外存储前后节点指针)。
  • 特有方法 (实现 Deque 接口,支持队列 / 栈操作):

    复制代码
    LinkedList<String> list = new LinkedList<>();
    list.addFirst("首元素"); // 头部添加
    list.addLast("尾元素"); // 尾部添加
    list.getFirst(); // 获取首元素(空表抛异常)
    list.getLast(); // 获取尾元素(空表抛异常)
    list.peekFirst(); // 安全获取首元素(空表返回 null)
    list.peekLast(); // 安全获取尾元素(空表返回 null)
    list.removeFirst(); // 删除首元素(空表抛异常)
    list.removeLast(); // 删除尾元素(空表抛异常)
    list.pollFirst(); // 安全删除首元素(空表返回 null)
  • 遍历方式:

    • 增强 for 循环(推荐);
    • 迭代器 Iterator(支持边遍历边删除,避免并发异常);
    • 逆序迭代器 descendingIterator()(从尾到头遍历)。
  • 适用场景:频繁在首尾或中间位置增删元素的场景(如队列、栈、链表结构模拟)。

  1. Vector(不推荐新项目使用)
  • 底层结构 :动态数组(Object[]),早期线程安全实现。

  • 核心特性:

    • 线程安全 :所有方法用 synchronized 修饰,保证多线程安全,但性能较低。
    • 扩容机制:默认初始容量 10,满容后扩容为原容量的 2 倍(ArrayList 为 1.5 倍)。
    • 功能:与 ArrayList 类似,但方法加锁导致单线程性能差。
  • 常用方法 :与 ArrayList 基本一致,额外支持 Enumeration 遍历(遗留接口)。

  • 适用场景 :需线程安全的多线程场景(现多被 ArrayList + Collections.synchronizedList() 或 CopyOnWriteArrayList 替代)。

三、三大实现类对比表

特性 ArrayList LinkedList Vector
底层结构 动态数组 双向链表 动态数组
随机访问效率 快(O(1)) 慢(O(n)) 快(O(1))
中间增删效率 慢(O(n)) 较快(O(n),定位耗时) 慢(O(n))
首尾增删效率 快(O(1)) 快(O(1)) 快(O(1))
线程安全 否 否 是(方法加锁)
内存占用 低 高(节点指针) 低
适用场景 大量读操作、随机访问 频繁增删(首尾 / 中间) 多线程安全需求(少用)

四、使用建议

  1. 单线程场景:

    • 以查询为主、少量增删 → 优先 ArrayList(性能最优)。
    • 频繁增删(尤其是中间位置) → 选择 LinkedList。
  2. 多线程场景:

    • 需线程安全 → 用 Collections.synchronizedList(new ArrayList<>()) 或 CopyOnWriteArrayList(并发包,读多写少时高效),避免使用 Vector(性能差)。
  3. 遍历注意:

    • ArrayList 适合普通 for 循环(索引访问快);
    • LinkedList 适合增强 for 或迭代器(避免索引遍历的性能损耗);
    • 遍历时删除元素需用 Iterator.remove(),避免 ConcurrentModificationException。
相关推荐
weixin1997010801618 小时前
《1688物流API接口边界:logistics.trace.get 与 freight.template.list 的隐藏约束》(附Python源码)
windows·python·list
爱编程的Zion1 天前
【踩坑记录】同一个 WiFi 下,A 电脑能访问 192.168.0.115,B 电脑死活不行 ——Windows 路由表缺失引发的故障排查
windows·电脑
Qwier1 天前
Win Srv 2019 安装补丁后重启
运维·服务器·windows
lusklusklusk1 天前
Python 四大数据结构详解:元组、列表、集合、字典的特点与增删改查
数据结构·windows·python
今年下半年1 天前
【运维】windows虚拟机安装arm(aarch64)服务器
运维·windows·arm·虚拟机·aarch64
浪潮IT馆1 天前
Windows 10 安装 PostgreSQL 9.6.24 完整教程
数据库·windows·postgresql
sukalot1 天前
Windows 驱动实例分析系列:libwdi 驱动分析 - libwdi 篇(一)
windows
奇树谦1 天前
Windows 下使用 PowerShell 和 CMD 排查端口占用
windows
万年咸鱼2 天前
Qt Windows 使用管理员权限运行 Cmd
windows
2601_962364972 天前
从录入到解锁,完整梳理 Windows Hello 识别链路
windows·安全·电脑