ArrayList

ArrayList内部使用数组实现

内部关键变量

1
2
3
4
5
6
7
8
9
10
// 默认初始容量
private static final int DEFAULT_CAPACITY = 10;
// 空列表常量
private static final Object[] EMPTY_ELEMENTDATA = {};
// 默认空列表常量
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 存放数据数组
transient Object[] elementData;
// 列表大小(列表大小并不总是等于elementData.length,因为elementData会有冗余)
private int size;

构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 
* 创建一个初始容量为0空列表
* 使用DEFAULTCAPACITY_EMPTY_ELEMENTDATA填充elementData
*/
public ArrayList();
/*
* 如果initialCapacity大于0,创建一个初始容量为initialCapacity的列表
* 为elementData创建一个大小为initialCapacity的数组
*
* 如果initialCapacity等于0,创建一个初始容量为0的数组
* 使用EMPTY_ELEMENTDATA填充elementData
*
* 如果initialCapacity小于0,抛出IllegalArgumentException
*/
public ArrayList(int initialCapacity);
/*
* 传入一个集合如果c长度不为0,将c的数组复制到elementData
* c的长度赋值到size
*/
public ArrayList(Collection<? extends E> c);

扩容机制

如果使用无参构造创建List,在第一次扩容时如果如果期望容量小于10则会将容量设置为10
后续扩容newCapacity = oldCapacity + (oldCapacity >> 1)也就是说每次扩容后大小是原数组大小的1.5倍

RandomAccess

ArrayList实现了RandomAccess接口,实际上RandomAccess内部并无