跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

Java 常见 List 实现区别及与 Set 的对比

综述由AI生成Java 中 List 接口的多种实现类,包括 ArrayList、LinkedList、Vector、Stack 和 CopyOnWriteArrayList。详细分析了它们的底层结构、线程安全性、时间复杂度及适用场景。同时对比了 List 与 Set 的核心区别,涵盖有序性、重复元素允许情况及访问方式。文章指出 ArrayList 适合查询,LinkedList 适合头尾操作,并发读多场景推荐使用 CopyOnWriteArrayList,而 Vector 和 Stack 因性能问题已逐渐淘汰。

beaabea发布于 2026/3/25更新于 2026/5/316 浏览
Java 常见 List 实现区别及与 Set 的对比

Java 中 List 的几种实现

List 是有序、可重复的集合接口 常见实现:ArrayList、LinkedList、Vector、Stack、CopyOnWriteArrayList

ArrayList

底层结构
  • 动态数组
  • 初始容量:10
  • 扩容机制

新容量 = 旧容量 + 旧容量 / 2(1.5 倍)

时间复杂度
操作复杂度说明
随机访问 get(i)O(1)数组下标
尾部 addO(1) 均摊扩容时 O(n)
中间插入/删除O(n)元素整体移动
线程安全
  • 非线程安全

解决方案:Collections.synchronizedList;CopyOnWriteArrayList

LinkedList

底层结构
  • 双向链表
  • 每个节点:prev | item | next
时间复杂度
操作复杂度说明
get(i)O(n)要遍历
头/尾插入删除O(1)指针操作
中间插入O(n)找位置

Vector

底层结构
  • 动态数组(和 ArrayList 类似)

关键区别

  • 线程安全
  • 方法都加了 synchronized

问题

  • 性能差(锁太重)
  • 已被淘汰

Stack

继承关系
Stack extends Vector
特点
  • 后进先出(LIFO)
  • 线程安全(继承 Vector)

CopyOnWriteArrayList(并发重点)

底层思想
  • 写时复制
特点
方面说明
线程安全✅
读性能非常高
写性能较差(复制数组)
迭代不会抛 ConcurrentModificationException

对比总结

实现底层线程安全适合场景
ArrayList动态数组❌查询多
LinkedList双向链表❌头尾操作多
Vector动态数组✅淘汰
Stack栈✅淘汰
CopyOnWriteArrayList数组复制✅并发读多

面试常见问题

Q1:ArrayList 和 LinkedList 区别?

ArrayList:数组,查询快,插入慢 LinkedList:链表,头尾操作快,随机访问慢

Q2:为什么 ArrayList 不是线程安全?

add / remove 过程中可能发生: 扩容 覆盖 数据丢失

Q3:CopyOnWriteArrayList 为什么读快?

读操作不加锁 始终读的是稳定数组快照

Q4:为什么不推荐 Vector / Stack?

synchronized 粒度太大 性能差 有更好的并发方案

总结

ArrayList 查得快,LinkedList 插得快(头尾), 并发读多用 CopyOnWrite,Vector Stack 已淘汰

List 与 Set 的区别

List vs Set

对比点ListSet
是否有序✅ 有序(按插入顺序)❌ 大多无序(LinkedHashSet 例外)
是否允许重复✅ 允许❌ 不允许
是否有下标✅ 有(get(i))❌ 没有
常见实现ArrayList、LinkedListHashSet、LinkedHashSet、TreeSet
典型用途保存'有顺序、可重复'的数据保存'去重'的数据

一句话记忆:

List = 有顺序 + 可重复 Set = 去重

什么是 List?

  • 像数组的升级版
  • 能按顺序存
  • 能存重复元素
  • 能通过下标访问
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(10);
list.add(20);
System.out.println(list); // [10, 10, 20]
System.out.println(list.get(1)); // 10

什么是 Set?

  • 天然去重
  • 关心你插入顺序
  • 没有下标
Set<Integer> set = new HashSet<>();
set.add(10);
set.add(10);
set.add(20);
System.out.println(set); // [10, 20]

Set 是怎么判断'重复'的?

靠 hashCode() + equals()

  1. 先算 hashCode
  2. 再用 equals 比较

List vs Set 核心区别

List 和 Set 都是 Collection 的子接口,主要区别在于是否允许重复和是否有顺序。List 允许重复元素并且有下标,适合顺序存储;Set 不允许重复元素,主要用于去重。

一句话总结

List:顺序 + 重复 + 下标 Set:去重 + 无下标 + 基于 equals/hashCode

目录

  1. Java 中 List 的几种实现
  2. ArrayList
  3. 底层结构
  4. 时间复杂度
  5. 线程安全
  6. LinkedList
  7. 底层结构
  8. 时间复杂度
  9. Vector
  10. 底层结构
  11. 关键区别
  12. 问题
  13. Stack
  14. 继承关系
  15. 特点
  16. CopyOnWriteArrayList(并发重点)
  17. 底层思想
  18. 特点
  19. 对比总结
  20. 面试常见问题
  21. 总结
  22. List 与 Set 的区别
  23. List vs Set
  24. 什么是 List?
  25. 什么是 Set?
  26. Set 是怎么判断“重复”的?
  27. List vs Set 核心区别
  28. 一句话总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Seedance 2.0 双分支扩散变换器架构解析与工程实现
  • VirtualBox Ubuntu 虚拟机与 Windows 主机文本复制粘贴设置指南
  • C++ 面试核心知识点总结:语法、内存与类机制
  • 前端基础入门:HTML、CSS 与 JavaScript 核心概览
  • Flutter 与 Web 混合开发实践
  • DICOM 标准详解:文件解析、Java/Python 库与 AI 应用
  • Neo4j Desktop 2 安装与使用指南
  • 2026 前端跨端框架选型指南
  • 基于 Python 的 Live2D 虚拟主播软件
  • 基于 Go 构建可自我演进 AI 助手的架构设计与实践
  • Python 轻量级环境管理工具 UV 入门与 Windows 安装实战
  • 鸿蒙系统 PC 版安装与使用指南
  • OpenClaw Docker 部署:集成飞书钉钉 QQ 机器人的网关方案
  • C++ 继承机制详解:从基础到多继承与组合
  • 医疗 AI 场景下算法编程深度解析(五):朴素贝叶斯算法
  • 前端跨标签页通信:BroadcastChannel 原理解析与实战
  • Telegram 群组管理机器人搭建:从零开始配置 Bot
  • Python 核心技术点梳理:装饰器、拷贝与数据结构
  • Python 基于 Transformer 的时序数据建模与实现详解
  • Python 类型注解详解:AI 大模型开发实战

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online