public boolean addAll(Collection<? extends E> c) {// 给定集合转换成Object[]数组 Object[] a = c.toArray(); // 加入数组的长度 int numNew = a.length; // 确保集合容量足够存储 ensureCapacityInternal(size + numNew); // 进行数组拷贝 System.arraycopy(a, 0, elementData, size, numNew); // 集合整体长度增加 size += numNew; return numNew != 0; }
public boolean addAll(int index, Collection<? extends E> c) {// 角标范围检查 rangeCheckForAdd(index); // 将待添加的集合转换成数组 Object[] a = c.toArray(); // 确保容器可存储 int numNew = a.length; ensureCapacityInternal(size + numNew); // 原集合需要移动的个数 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; }private void rangeCheckForAdd(int index) {if(index < 0 || index > size) {throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } }
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; }
public void trimToSize(){modCount++; if(size < elementData.length) {elementData = (size == 0)? EMPTY_ELEMENTDATA : Arrays.copyOf(elementData,size); }}