ArrayList集合
ArrayList底层就是一个长度可以动态调整的Object数组
有一个记录数组长度的size字段
数组是默认长度是10,还准备有一个空的数组。
ArrayList有一个父类,并实现了List等多个接口(RandomAccess, Cloneable, java.io.Serializable接口中一个方法也没有)
无参创建:
ArrayList list = new ArrayList();
JDK1.7中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是10。
JDK1.8中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是0,第一次添加元素,容量不足就要进行扩容了。
执行代码:
list.add(20);
扩容的具体实现:
每次扩容扩50%,扩大后再次进行比较
把数组的长度赋给oldCapacity
int oldCapacity = elementData.length;
新的数组容量=老的数组长度的1.5倍。oldCapacity >> 1 相当于除以2
int newCapacity = oldCapacity + (oldCapacity >> 1);
如果新的数组容量newCapacity小于传入的参数要求的最小容量minCapacity,那么新的数组容量以传入的容量参数为准。
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
如果新的数组容量newCapacity大于数组能容纳的最大元素个数 MAX_ARRAY_SIZE 2^{31}-1-8
那么再判断传入的参数minCapacity是否大于MAX_ARRAY_SIZE,如果minCapacity大于MAX_ARRAY_SIZE,那么newCapacity等于Integer.MAX_VALUE,否者newCapacity等于MAX_ARRAY_SIZE。
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
其他方法:
//1
list.size();
直接返回size:
//2
list.isEmpty();
通过判断size是否为0,若长度为0则为空:
//3
list.indexOf(20);
内部通过一个for循环进行判断:
//4
list.get(2);
先验证索引是否超范围
超过范围(过大)报IndexOutOfBoundsException异常
索引为负数报运行时异常
//5
list.iterator();