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();

本文详细介绍了ArrayList的内部实现,包括其默认初始容量、扩容机制以及相关操作如add、size、isEmpty、indexOf和get等。在JDK1.7和1.8中,ArrayList的默认容量有所不同。扩容时,数组容量会增长50%,并在必要时依据传入的最小容量进行调整。此外,文章还提及了获取元素、检查列表状态等基本操作的实现细节。
614

被折叠的 条评论
为什么被折叠?



