ArrayList源码分析

简介

ArrayList底层是数组实现的,可以自增扩容的数组,此外它是非线程安全的,一般多用于单线程环境下(Vector是线程安全的,所以ArrayList 性能相对Vector 会好些)

ArrayList继承了AbstractList,实现了List接口

  1. 实现了Serializable接口,因此它支持序列化,能够通过序列化传输(实际上java类库中的大部分类都是实现了这个接口的)

  2. 实现了RandomAccess接口,支持快速随机访问(只是个标注接口,没有实际的方法),这里主要表现为可以通过数组下标直接访问

  3. 实现了Cloneable接口,能被克隆

初始化

transient Object[] elementData; //存储数组元素的缓冲区

private static final Object[] EMPTY_ELEMENTDATA = {}; //空数组元素

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //默认空数组元素

private static final int DEFAULT_CAPACITY = 10; //默认初始化容量

private int size; //数组的大小

protected transient int modCount = 0; //记录被修改的次数

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//数组的最大值

构造方法

1. public ArrayList()

2. public ArrayList(Collection<? extends E> c)

3. public ArrayList(int initialCapacity);

无参的构造方法

带参数的构造方法1

带参数的构造方法2

从源码里可以看出:首先对传进来的初始化参数initialCapacity进行判断:

  如果initialCapacity参数大于0,elementData初始化为一个容量为initialCapacity的数组;如果参数等于0,则将elementData指向了EMPTY_ELEMENTDATA

 方法介绍

add方法

总结

 ArrayList 内部实现为一个对象数组存放具体的值,用一种扩容的机制,进行数组的动态增长扩容机制。元素的个数大于其容量,则把其容量扩展为原来容量的1.5倍

posted @ 2019-03-28 13:40  __Helios  阅读(181)  评论(0编辑  收藏  举报