ArrayList.addAll, ArrayList.add和for循环--Java

ArrayList

该类实现List接口, 实现可变大小的数组,随机访问和遍历元素时,提供更好的性能, 非同步的,在多线程情况下不要用. ArrayList
增长当前长度的50%, 插入效率低.

ArrayList.add

把整个list作为一个元素放到目标list里.

ArrayList.addAll

把list中每个元素拿出来后一个个放到目标List里.

ArrayList.add与for循环比较

  • 小数据量(20以下): for循环效率高
  • 大数据量(20以上): addAll效率高

原因

ArrayList的addAll实现:

public boolean addAll(Collection c){
Object[] a =c.toArray();
int numNew=a.length;
ensureCapacity(size + numNew);//   Increments   modCount 
System.arraycopy(a,0,elementData,size,numNew);
size+=numNew;
return numNew!=0;
}
  • arraycopy方法: 拷贝数组的时候用了拷贝内存的做法,效率比遍历数组快很多. 首先找到数据源,然后将该段内存拷贝. arraycopy的定义:

    public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);

  • native关键字: 这个函数的源码在JDK中没有.它调用的本地计算机中的函数,这个函数是C/C++写的, 编译成DLL,Java调用.所以效率比for循环快.

综上:
为什么在大数据量时使用addall方法效率快?

  • arraycopy: 使用内存拷贝,移动数据
  • native: 本地函数,执行效率更高.

小数据量时?
以上两点不明显, 首先要调用toArray方法(要遍历操作), 在小数据量时,效果没有for来的好。

你可能感兴趣的:(项目,编程语言,-----java)