请给出Java中Arraylist类的源码并给出注释
下面是ArrayList类的部分源码和注释:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
// 默认初始容量
private static final int DEFAULT_CAPACITY = 10;
// 用于空实例共享的共享空数组实例
private static final Object[] EMPTY_ELEMENTDATA = {};
// 用于默认大小的空实例共享的共享空数组实例
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 存储ArrayList元素的数组缓冲区
transient Object[] elementData; // 非私有以简化嵌套类访问
// ArrayList的大小(包含的元素数)
private int size;
// 构造一个具有指定初始容量的空列表
public ArrayList(int initialCapacity) {
// 如果初始容量大于0,则初始化elementData数组为对应大小
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
}
// 否则,初始化elementData数组为EMPTY_ELEMENTDATA
else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
}
// 如果初始容量小于0,则抛出IllegalArgumentException异常
else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
// 构造一个初始容量为10的空列表
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// 添加一个元素到ArrayList的末尾
public boolean add(E e) {
// 确保容量足够
ensureCapacityInternal(size + 1); // Increments modCount!!
// 在elementData中添加元素
elementData[size++] = e;
return true;
}
// 确保ArrayList的容量至少为minCapacity
private void ensureCapacityInternal(int minCapacity) {
// 如果elementData是共享空数组实例,则将其扩容为默认容量或者minCapacity中的较大值
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
// 确保ArrayList的容量至少为minCapacity
ensureExplicitCapacity(minCapacity);
}
// 确保ArrayList的容量至少为minCapacity
private void ensureExplicitCapacity(int minCapacity) {
// 修改次数加1
modCount++;
// 如果minCapacity大于当前容量,则进行扩容操作
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
// 对ArrayList进行扩容
private void grow(int minCapacity) {
// 没有并发修改
int oldCapacity = elementData.length;
// 扩容1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 比较新容量和所需最小容量,取较大值
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 比较新容量和最大数组容量,取较小值
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 将原有数据拷贝到新容量的数组中
elementData = Arrays.copyOf(elementData, newCapacity);
}
// 取两数的较大值,如果结果超过最大数组容量,则返回最大数组容量
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
// 获取ArrayList中指定索引处的元素
public E get(int index) {
// 检查索引是否越界
rangeCheck(index);
return elementData(index);
}
// 检查索引是否越界
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
// 返回索引越界异常的详细信息
private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}
// 从elementData中获取指定索引处的元素
E elementData(int index) {
return (E) elementData[index];
}
// 移除ArrayList中指定索引处的元素
public E remove(int index) {
// 检查索引是否越界
rangeCheck(index);
// 修改次数加1
modCount++;
// 获取要移除的元素
E oldValue = elementData(index);
// 计算要移动的元素个数
int numMoved = size - index - 1;
// 如果numMoved大于0,则需要将后面的元素向前移动
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
// 将最后一个元素置为null
elementData[--size] = null;
return oldValue;
}
// 清空ArrayList中的所有元素
public void clear() {
// 修改次数加1
modCount++;
// 将所有元素置为null
for (int i = 0; i < size; i++)
elementData[i] = null;
// 将ArrayList的大小设为0
size = 0;
}
}
以上代码是ArrayList类的部分源码和注释。由于ArrayList类的源码比较长,这里只展示了一部分常用的方法。完整的ArrayList类源码可以在Java官方文档或开源代码库中找到
原文地址: https://www.cveoy.top/t/topic/iz8g 著作权归作者所有。请勿转载和采集!