1、数据结构不同。
- ArrayList是一个基于Array的动态数组,可以动态扩容,元素存储空间连续;
- 而LinkedList是一个双向链表,每个数据单元包括两个前后驱指针prev、next和放置数据元素的数据单元item,元素存储地址零散。
2、使用场景不同。
- ArrayList存储内存空间是连续的,适用于存储大量数据元素,并能高效的根据下标进行随机访问(查多改少)的情景,是最常用的列表;
- 而LinkedList适合经常插入和删除而查询操作少(查少改多)、存储数据量较小的情景。
3、效率不同。
- ArrayList随机访问的效率相比较高,时间复杂度O(1), 而插入和删除因为可能涉及元素移动, 相比效率较慢;
- 而LinkedList插入和删除的速度较快,只需知道要删除元素指针就能很快删除, 开销集中在遍历查找元素指针位置, 没有元素移动开销大。
思考: ArrayList一定没有LinkedList删除插入的操作快嘛?
在海数据量情况下如百万级别,插入/修改在表中的位置不同,尤其是约靠近尾部进行删除插入,LinkedList的优势就可能会消失。
原因是海量数据下, 两者移动元素和遍历指针的量级都为O(n),且查询效率略快于移动元素,这要是修改的元素位于中部或者尾部,使得移动的次数比较少、而遍历查找的次数比较多,那LinkedList就没ArrayList快了)
4、占用内存大小不同。
- LinkedList每个节点因为不止要存储数据,还有两个前驱和后驱指针,内存相对占比较大。(ArrayList的空间浪费体现在列表末尾的空间预留,但内存占比相比没那么大)
5、其他的不同
- LinkedList还额外实现了Deque接口,可以实例化作为一个双向队列使用;
- LinkedList和ArrayList类中的操作方法有些许不同等。