§2.3.3 ArrayList vs LinkedList
考察意图:是否理解List不同实现的性能差异及工程选型判断。
回答样板:
| 维度 | ArrayList | LinkedList |
|---|---|---|
| 底层结构 | 动态数组(Object[]) | 双向链表(Node) |
| 随机访问 | O(1) | O(n)——需要遍历 |
| 尾部插入 | O(1)均摊(扩容时O(n)) | O(1) |
| 头/中间插入 | O(n)(需要移动元素) | 头O(1),中间O(n)——定位+O(1)插入 |
| 内存开销 | 连续内存,数据紧凑 | 每个节点额外存储prev+next指针 |
工程实践:实际开发中ArrayList用得更多。原因是内存连续、CPU缓存友好(缓存行预读),大多数场景下遍历性能远超LinkedList。LinkedList的优势场景是频繁头尾插入删除(如队列、栈)。日常开发90%场景ArrayList够用。
ArrayList扩容:默认初始容量10,扩容时增长为原来的1.5倍(oldCapacity + (oldCapacity >> 1)),通过Arrays.copyOf拷贝数组。
陷阱提示:不知道ArrayList扩容机制细节;说"LinkedList插入快"不考虑定位开销。