java集合源码分析①----ArrayList

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/myjess/article/details/119513515