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源码分析的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList源码和多线程安全问题分析

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

ArrayList精讲(源码分析)---Java集合

ArrayList精讲(源码分析)---Java集合

Java中Arraylist源码分析