美文网首页
ArrayList源码分析

ArrayList源码分析

作者: 综合楼 | 来源:发表于2023-11-28 11:49 被阅读0次

ArrayList源码分析

实现接口关系图

image.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%

源码

image.png
简述

transient Object[] elementData;
其内部维护一个可变容量的数组;
本身不支持异步操作,通过modCount来判断是否有异步修改
可以使用Collections.synchronizedCollection(list);来进行异步操作

使用注意

用for循环遍历List删除元素时,需要注意索引会左移的问题。
List删除元素时,为避免陷阱,建议使用迭代器iterator的remove方式。

相关文章

网友评论

      本文标题:ArrayList源码分析

      本文链接:https://www.haomeiwen.com/subject/qbatgdtx.html