如果想在数组的指定位置插入一个元素,而不是修改该位置,你会怎么做?大家都知道数组的优势是查找快速,但删除和插入较为麻烦。在阅读了ArrayList的add()方法之后,对这个问题有了一个具有指导意义的答案。
在调用list.add()方法之前,会先进行index验证,不符合要求则会抛出异常,size是当前数组中元素的个数,在这里可以看出ArrayList不允许隔着空位置插元素,只能依次插入。在添加之前,还会调用ensureCapacityInternal(size+1)方法来确保内部elementData对象有足够的容量,具体的扩容方法可以查看grow(miniCapacity)这个方法,PS:有人说扩容后的容量是之前的1.5倍+1,但是我看到的是newCapacity = oldCapacity+(oldCapacity >>1),也就是说扩容后容量是之前的1.5倍,并没有+1,如有错误,欢迎指正。
回归正题,ArrayList采用了System.arrayCopy()这个方法,但有意思的是,它不但把elementData当成了复制的原始数组,同时也将elementData作为了目标数组,即从elementData数组的index位置开始拷贝,拷贝的数量是从index至size-index,然后从elementDat的index+1位置开始放入。最后让elementData[index] = element;这样就利用copy而实现数组元素的后移插入。这样的实现思路对于数组的删除和插入有很大的启发和指导意义。
至于System.arraycopy源码,本人水平有限目前无法做出解读,下面分享一篇博客供大家参考 [System.arraycopy 本地方法 源代码分析 ](http://blog.csdn.net/u011642663/article/details/49512643)