1、ArrayList
底层原理:动态数组
-
ArrayList 底层是 Object[ ] 数组,初始容量为10
-
扩容机制:当数组满时,新容量 = 旧容量 * 1.5(位运算优化);新容量 = 旧容量 + (旧容量 >> 1)(位运算)
-
add( ) 方法的执行流程:检查扩容 —> 扩容(调用grow( ) )—> 赋值
2、LinkedList
底层原理:双向链表
-
LinkedList 基于双向链表,包含Node节点(prev,item,next),每个节点都有前后指针
-
插入删除效率高,只需要修改节点引用
-
随机访问效率低,需要遍历
3、ArrayList VS LinkedList
| 特性 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组 | 双向链表 |
| 存储结构 | 连续内存块 | 非连续内存块 |
| 随机访问 | O(1) | O(n) |
| 头部插入 | O(n) | O(1) |
| 尾部插入 | O(1) | O(1) |
| 中间插入 | O(n) | O(n) + O(1)(查找+插入) |
| 头部删除 | O(n) | O(1) |
| 尾部删除 | O(1) | O(1) |
| 中间删除 | O(n) | O(n) + O(1)(查找+删除) |
| 适用场景 | 频繁查询、尾部操作 | 频繁插入删除、 队列/栈操作 |
4、原理思考
- 为什么ArrayList随机访问快?
核心原因:底层是动态数组,连续存储元素。可通过下标直接定位元素地址。
- 为什么LinkedList插入快?
核心原因:底层是双向链表,由节点组成,有前后指针。