List集合的知识点
核心基础概念
定义:List 是 Java 集合框架中继承自 Collection 接口的有序集合(序列)。
核心特性(三大保证):
有序性:元素插入的顺序与迭代输出的顺序一致(索引从 0 开始)。
可重复性:允许存储 null 和重复的元素(通过 equals() 方法判断)。
索引访问:支持通过整数索引(get(int index))进行随机访问。
- 继承体系与架构
text
Iterable (接口)
└── Collection (接口)
└── List (接口)
├── AbstractList (抽象类)
│ ├── ArrayList (实现类) —— 日常开发首选
│ └── AbstractSequentialList (抽象类)
│ └── LinkedList (实现类) —— 双向链表
├── Vector (实现类) —— 线程安全,但已过时
│ └── Stack (实现类) —— 栈,继承自Vector
└── CopyOnWriteArrayList (实现类) —— 并发包中的线程安全类 - 三大主流实现类对比(高频考点)
特性 ArrayList LinkedList Vector
底层数据结构 动态数组(Object[]) 双向链表(JDK 1.6之前为双向循环链表) 动态数组(Object[])
线程安全 不安全(非同步) 不安全(非同步) 安全(方法用 synchronized 修饰)
初始容量 10(JDK 1.8 懒加载,添加元素时分配) 无初始容量概念 10
扩容机制 扩容为原容量的 1.5 倍(oldCapacity >> 1) 无需扩容(链表动态增长) 扩容为原容量的 2 倍
随机访问(查) O(1),极快(实现 RandomAccess 接口) O(n),极慢(需遍历指针) O(1)
增删操作 尾部增删 O(1);中间增删 O(n)(涉及数组拷贝) 头部/尾部 O(1);中间指定位置 O(n)(需先遍历) 同 ArrayList(但线程安全开销大)
内存占用 数组末尾会有预留的容量空间(浪费内存) 每个节点存储前驱/后继指针(占用更大内存) 同 ArrayList - 底层核心源码原理(深挖)
ArrayList 扩容细节:
JDK 1.8:创建时底层数组初始化为空数组 {},第一次 add 时扩容到 10。
扩容调用 Arrays.copyOf(),底层是 System.arraycopy()(本地方法,内存拷贝,效率高)。
最大容量为 Integer.MAX_VALUE - 8(预留 8 字节作为对象头存储)。
LinkedList 结构:
节点对象 Node
浙公网安备 33010602011771号