首先看ArrayList的签名
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList特点:
随机访问速度快,插入和移除性能较差(数组的特点);
支持null元素;
有顺序;
元素可以重复;
线程不安全;
ArrayList主要用 Object[] elementData作为其基本数据结构。
size维护元素个数,size不一定等于elementData.length,当size大于elementData.length的时候需要对elementData进行扩容。
源码中用的最多的两个方法是Arrays.copyOf和System.arraycopy。
Arrays.copyOf源码:
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
可以看到,Arrays.copyOf主要也用到了System.arraycopy方法,System.arraycopy是一个native方法,方法签名如下:
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
意思是从src的srcPos位置,复制length长度的内容到dest的destPos位置。
因为ArrayList是用数组作为其基本数据结构的,当插入、移除制定位置的元素时候都要移动数组,移动数组就用到了System.arraycopy方法。
ArrayList的subList方法要注意。它返回原来list的从[fromIndex, toIndex)之间这一部分的视图,之所以说是视图,是因为实际上,返回的list是靠原来的list支持的。所以,你对原来的list和返回的list做的“非结构性修改”(non-structural changes),都会影响到彼此对方。所谓的“非结构性修改”,是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。
参考:https://www.cnblogs.com/gaojing/archive/2012/06/17/java-list-sublist-caution.html