ArrayList源码分析
Posted swifthao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList源码分析相关的知识,希望对你有一定的参考价值。
顶部注释告诉我们的信息
-
ArrayList是实现了List接口的可变长数组(ArrayList的底层是基于数组实现的)
-
ArrayList允许内部存在null元素
-
ArrayList除了不是线程安全的之外,和Vector基本差不多。(如果想使用线程安全的ArrayList:List list = Collections.synchronizedList(new ArrayList(...));或者使用CopyOnWriteArrayList
-
size、isEmpty、get、set、iterator和listIterator方法都以固定时间运行,时间复杂度为O(1)。add和remove方法需要O(n)时间。与用于LinkedList实现的常数因子相比,此实现的常数因子较低。
-
每个ArrayList实例都有一个capacity属性,随着元素不断add到ArrayList,capacity会自动增加
-
在添加大量元素之前,可以使用ensureCapacity操作来增加ArrayList的容量,这可以减少递增的重新分配次数
-
ArrayList的iterator和listIterator方法返回的迭代器是fail-fast的。
-
fail-fast不能保证一定会被执行的,所以依赖于fail-fast抛出的异常的程序都是错误的写法。fail-fast抛出的异常只能用来帮你detect bugs
源码部分
定义
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
-
继承于AbstractList类,AbstractList提供了List接口的骨干实现,以最大程度减少随机访问ArrayList所需的工作
-
实现了RandomAccess接口,这是个Marker Interface,用来表示List支持常数时间内的快速随机访问,用index去遍历实现了RandomAccess接口的类是要比用iterator遍历快的
+实现了Cloneable接口,表明其可以调用clone()方法来返回实例的field-for-field拷贝
- 实现了java.io.Serializable接口,表明该类具有序列化功能(transient关键字表示:这个实例序列化时不要序列化transient修饰的属性)
以上是关于ArrayList源码分析的主要内容,如果未能解决你的问题,请参考以下文章
Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段