默认的构造函数,直接初始化一个ArrayList实例的话,会将内部的数组做成一个默认的空数组,{},Object[],他有一个默认的初始化的数组的大小的数值,是10,也就是我们可以认为他默认的数组初始化的大小就是只有10个元素
基本上最好是给ArrayList构造的时候,给一个比较靠谱的初始化的数组的大小,比如说,100个数据,1000,10000,避免数组太小,往里面塞入数据的时候,导致数据不断的扩容,不断的搞新的数组
add()方法的源码
arduino
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
scss
ensureCapacityInternal(size + 1); // Increments modCount!!
你每次往ArrayList中塞入数据的时候,人家都会判断一下,当前数组的元素是否塞满了,如果塞满的话,此时就会扩容这个数组,然后将老数组中的元素拷贝到新数组中去,确保说数组一定是可以承受足够多的元素的
set()方法的源码
ini
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
add(index, element)方法的源码
scss
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
get()方法的源码
scss
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
remove()方法的源码
ini
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
总结
remove()
add(index, element)
这个两个方法,都会导致数组的拷贝,大量元素的挪动,性能都不是太高,基于数组来做这种随机位置的插入和删除,其实性能真的不是太高
add()、add(index, element),这两个方法,都可能会导致数组需要扩容,数组长度是固定的,默认初始大小是10个元素,如果不停的往数组里塞入数据,可能会导致瞬间数组不停的扩容,影响系统的性能
set()、get(),定位到随机的位置,替换那个元素,或者是获取那个元素,这个其实还是比较靠谱的,基于数组来实现随机位置的定位,性能是很高的