今天看ArrayList 源码时发现了一个可以快速移动数组的方法System.arraycopy()
它一共5个参数
- 原数组 (就是要被复制的数组)
- 从那个位置开始
- 目标数组
- 复制到那个位置
- 复制多少元素
这样一看没什么啊
但是当目标数组和被数组数组是同一个数组时就会有意想不到的结果
可以看一下下面的代码
public class ArrayListTest {
public static void main(String[] args) {
int elementData[] = new int[10001];
for(int i=0;i<1000;i++)
{
elementData[i]=i;
}
long time =System.currentTimeMillis();
int length = elementData.length;
System.arraycopy(elementData, 3, elementData, 3 + 1, (length-1) - 3);//3是插入的位置 length-1是为了保证数组的大小够
elementData[3]=100;//你想插入的数
long time1 = System.currentTimeMillis();
System.out.println(time1-time);
}
}
这是结果 0秒 (牛逼)
我们正常的写法是从尾部进行循环直到当前要插入的位置
int n=1000000,k=3;
for(int i=n;i>k;i--)
{
elementData[i]=elementData[i-1];
}
long time3 = System.currentTimeMillis();
elementData[3]=100;//你想插入的数
System.out.println(time3-time2);
当数据量1000000时可以看到两个对比的结果还是很明显的
但时当数据量过大时比如100100000 时效果就不一样了
我的猜测是当数据量过大时储存地址不在一个连续的空间 寻址到的时间比较久