Arraylist.addAll方法---arraycopy
问题是这样产生的,网上一哥们发了一个面试题:
ListA 里面有? 1?? 2??? 3?
ListB里面有? 4??? 5?? 6?
让ListA变成? 1? 2? 3? 4? 5? 6??
我觉得很简单 ,就说用for循环遍历 添加就好了。结果面试官说
答案是使用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 这个方法。这个方法是使用拷贝内存的做法 ,效率比遍历数组块很多。
首先找到数据源 然后将该段内存拷贝。
当然值得注意的是,这个函数中还使用了toArray方法,这个方法是 要遍历操作的
但是如果需要多次遍历,那么addAll还是在性能上会获取优势的. .
下面是网上的一个测试 在20组数据时 还是 for效率高,但是在大数据量的时候 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方法效率快?
1.使用内存拷贝,移动数据。
2.本地函数,执行效率高。
那小数据量时呢?
以上2点都不明显,并且首先要调用toArray方法,在小数据量时,效果没有for来的好。
?
出处 :http://blog.csdn.net/sutaizi/article/details/6607123
?