modCount++;
// clear to let GC do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
这个方法是清除所有元素的方法。首先modCount自增。
然后进入for循环遍历每个元素,将每个元素设为空。
最后将size设为0。
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
这个方法是将参数中所有元素添加到本ArrayList中。首先将参数转换成数组。然后创建变量numNew赋值为参数转换的数组的长度。
然后调用之前的方法为底层数组扩容。
然后将参数转换后的数组拷贝到底层数组中。
然后size增加numNew个,最后返回numNew是否为0。
public boolean addAll(int index, Collection<? extends E> c) {
rangeCheckForAdd(index);
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
int numMoved = size - index;
if (numMoved > 0)
System.arraycopy(elementData, index, elementData, index + numNew,
numMoved);
System.arraycopy(a, 0, elementData, index, numNew);
size += numNew;
return numNew != 0;
}
这个方法是将参数中的集合添加到指定下标处的方法。
首先先检查下标是否越界。
然后将参数集合转换成数组。然后获取转换后的数组长度numNew。
然后调用之前的方法为底层数组扩容。
创建一个变量numMoved赋值为size减去index,含义就是底层数组index之后多少元素要右移。
然后将底层数组index之后的元素向右移,中间腾出参数长度个元素。
然后将参数转换后的数组填充进底层数组。
size增加numNew个。最后返回numNew是否为0。
protected void removeRange(int fromIndex, int toIndex) {
modCount++;
int numMoved = size - toIndex;
System.arraycopy(elementData, toIndex, elementData, fromIndex,
numMoved);
// clear to let GC do its work
int newSize = size - (toIndex-fromIndex);
for (int i = newSize; i < size; i++) {
elementData[i] = null;
}
size = newSize;
}
这个方法是删除指定下标区间内元素的方法。
首先modCount自增。
然后创建变量numMoved,其值为size减去第二个参数。
然后将第二个参数下标处之后的元素全部移动到第一个参数下标处。
然后创建新变量newSize,其值为size减去两个参数之差,就是新长度。
进入for循环将newSize下标处之后的元素全部置空。最后将size设为newSize。