首页 > 技术文章 > ArrayList和LinkedList

xiaoxin-IT 2020-10-15 11:26 原文

1.ArrayList 是 java 集合框架中比较常用的数据结构了。继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。

 

 默认初始化容量为10,为Object数组

 

 

 

 ArrayList和数组的区别在于,ArrayList的长度是可变的,底层对数组进行了扩容处理,

add方法:

 

 

 

 扩容方法为grow

 

 2.LinkedList的底层是通过链表来实现的,和ArrayList不同的是其实现了Deque双端队列,继承的是AbstractSequentialList,他是AbstractList的子类

 

 

 

 从下面这个图可以看出来,AbstractSequentialList只支持从头到尾遍历查询,

 

 

 

顺序查询效率较低,由于LinkedList实现的是双端循环队列,在底层get方法的时候,做了一个优化,会首先判断获取元素的下标是否小于size的一半,小于一般则从首开始遍历,如果大于,则 从后面开始遍历,尽管如此,查询效率相对于arrayList还是低很多,源码如下

 

 

 

 总结:
1. LinkedList底层是基于双向链表的结构实现的,因此不存在容量不足的问题,所以这里没有扩容的方法。
2. 插入删除效率高,查找效率低;
3. 要注意源码中还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用。

推荐阅读