ArrayList源码分析
实现接口关系图
![](https://img.haomeiwen.com/i7484530/1a46832119ca4c25.png)
先看接口
Cloneable
Cloneable其实就是一个标记接口, 只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则会抛出CloneNotSupportedException(克隆不被支持)异常。
Serializable
Serializable是Java提供的序列化接口,是一个空接口,为对象提供标准的序列化与反序列化操作。
RandomAccess
RandomAccess 接口是一个空接口,只是一个标记接口,用以标记实现的List集合具备快速随机访问的能力。
例如:ArrayList具备快速随机访问功能,而LinkedList没有
image.png
拓展: ArrayList用for循环遍历比iterator迭代器遍历快,LinkedList用iterator迭代器遍历比for循环遍历快,所以说,当我们在做项目时,应该考虑到List集合的不同子类采用不同的遍历方式,能够提高性能!那怎么判断出接收的List子类是ArrayList还是LinkedList呢? 这时就需要用 instanceof 来判断List集合子类是否实现RandomAccess接口!
Iterable
可迭代的,iterator()返回一个迭代器。
image.png
拓展:spliterator()提供一个可分割的迭代器,支持并行处理,但不提供并行处理。
Collection
集合接口:提供集合的一些操作
拓展:并行计算
image.png
List
List接口用于表示一个有序、可重复的集合,可以通过索引(位置)来访问和修改其中的元素。
ArrayList
EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA区别
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
EMPTY_ELEMENTDATA:共享的空数组实例用于空实例。
DEFAULTCAPACITY_EMPTY_ELEMENTDATA:共享的空数组实例用于默认大小的空实例。我们将其与EMPTY_ELEMENTDATA区分开,以便在添加第一个元素时知道要扩容多少。
总结:EMPTY_ELEMENTDATA表示容量为0的空ArrayList,而DEFAULTCAPACITY_EMPTY_ELEMENTDATA表示容量为默认值的空ArrayList。
举个例子:
List<String> list = new ArrayList<>(0);
初始容量从1开始每次增长50%
List<String> list = new ArrayList<>();
初始容量从10(DEFAULT_CAPACITY = 10)开始每次增长50%
源码:
![](https://img.haomeiwen.com/i7484530/a750ac15211484a2.png)
简述
transient Object[] elementData;
其内部维护一个可变容量的数组;
本身不支持异步操作,通过modCount来判断是否有异步修改
可以使用Collections.synchronizedCollection(list);来进行异步操作
使用注意
用for循环遍历List删除元素时,需要注意索引会左移的问题。
List删除元素时,为避免陷阱,建议使用迭代器iterator的remove方式。
网友评论