集合类(ArrayList与LinkedList)

4 阅读1分钟

1、ArrayList

底层原理:动态数组

  • ArrayList 底层是 Object[ ] 数组,初始容量为10

  • 扩容机制:当数组满时,新容量 = 旧容量 * 1.5(位运算优化);新容量 = 旧容量 + (旧容量 >> 1)(位运算)

  • add( ) 方法的执行流程:检查扩容 —> 扩容(调用grow( ) )—> 赋值

2、LinkedList

底层原理:双向链表

  • LinkedList 基于双向链表,包含Node节点(prev,item,next),每个节点都有前后指针

  • 插入删除效率高,只需要修改节点引用

  • 随机访问效率低,需要遍历

3、ArrayList VS LinkedList

特性ArrayListLinkedList
底层结构动态数组双向链表
存储结构连续内存块非连续内存块
随机访问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插入快?

核心原因:底层是双向链表,由节点组成,有前后指针。