ArrayList中有个方法是public void add(int index, E object)
这个方法是在第index位置上插入元素。
按照常规做法,肯定是,将数组中index(包括index的元素)位置后面的元素后移一位,然后空出index位置,插入当前元素。
但是下面的做法只需要一个函数就搞定了。
这个函数也就是 System.arraycopy(a, index, a, index + 1, s - index); 我一看顿时傻眼了,我感觉很麻烦的操作一行语句就搞定了。
至于arraycopy这个函数,是一个native方法,如何实现的不得而知。应该是C++或者c一类的,用的移位的算法不得而知。
这个方法就是将数组a 从index位置后面的(包括index处的元素)s-index 个元素位移到index+1处
反正我找到了一个很好用的函数。
下面介绍add方法的实现:
@Override public void add(int index, E object) {
Object[] a = array;//将原来的数组赋值给一个新的引用
int s = size;//原来数组元素个数
if (index > s || index < 0) {//索引大于数组的个数,或者小于0则抛出 索引越界的异常
throwIndexOutOfBoundsException(index, s);
}
if (s < a.length) {//如果数组的元素个数小于 数组的总容量 说明还有空间插入直接调用下面的方法
//这个方法就是将数组a 从index位置后面的(包括index出的元素)s-index 个元素位移到index+1处
System.arraycopy(a, index, a, index + 1, s - index);
} else {//如果数组元素的个数等于数组的容量 则需要扩展一个新的更大的数组空间
// assert s == a.length;
Object[] newArray = new Object[newCapacity(s)];//新开辟了一块数组空间
System.arraycopy(a, 0, newArray, 0, index);//将a中从0后面的index个元素位移到newarrry数组中
System.arraycopy(a, index, newArray, index + 1, s - index);//然后再将index后面的元素放到newarray 的index+1处完成一次新的位移操作 此时index处的元素值为空
array = a = newArray;
}
//最后将index处的元素赋值新对象
a[index] = object;
size = s + 1;//元素个数+1
modCount++;
}