在小数据量时,for循环效率高,大数据量时addAll方法效率高:
原因如下:
ArrayList的addAll的实现为:
[java] view
plaincopy
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 方法就明显占优势了。http://www.exam8.com/computer/djks/dj2/Java/ziliao/200810/1314435.htmlhttp://www.exam8.com/computer/djks/dj2/Java/ziliao/200810/1314435.html
另外:
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来的好。
本文来自 爻爻大先生 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/cs6704/article/details/78180258?utm_source=copy
**
很明显,拷贝过来的是内存,不是值。所以会出现所有对象的个数对,但是值都是最后一个值。
**
怎么解决?
new 一个新的对象,重新给新的对象赋值。mapper查询出来的对象都一样,不要new新的接收容器,无论怎么new 新的list或者对象去接收mapper查询出来的值都改变不了问题的本质。
这样解决:
new 一个新的对象,用BeanUtilscopy的方法吧查询出来的值copy到new的新的地址去成为一个 新的对象。(暂时没想到好的解决办法)