在java中制作大型数组副本的最有效方法

时间:2013-02-06 07:29:00

标签: java android performance

我想复制一大堆整数值,例如将数组a复制到数组b。我找到了几种方法,包括:

int[] a = new int[]{1,2,3,4,5};
int[] b = new int[5];

System.arraycopy( a, 0, b, 0, a.length );

int[] a = new int[]{1,2,3,4,5};
int[] b = (int[])a.clone();

由于这是在移动设备上完成的,我希望能够最有效地完成这项工作。

请告诉我最好的方法。

5 个答案:

答案 0 :(得分:8)

System.arraycopy 是更好的方式。

原因:它通过本机代码实现,因此效率更高。 Josh Bloch 建议(在Effective Java中)避免使用 clone()方法来复制/克隆对象。

请参考:Effective Java: Analysis of the clone() method

答案 1 :(得分:2)

System.arraycopy(a,0,b,0,a.length);是一个很好的优化函数,如果你构建一个新对象,执行会更慢..

答案 2 :(得分:2)

是的,每个人都说arraycopy()更好,但是大多数人都倾向于忘记Dalvik VM 而不是 Oracle VM,他们链接到的源是指Oracle VM。我的猜测也是arraycopy()会更快。

<强>然而

如果你真的,真的需要这个副本进行最优化,只需要两种方法,看看它们的表现如何。如果你真的想知道真正的答案,这总是要走的路。特别是在您要定位的设备上执行此操作,因为它可能会因设备与另一台设备的行为而异乎寻常。

答案 3 :(得分:1)

System.arraycopy是本机实现,比克隆更有效。它可以在单memorycopymemcpy)中复制数组。

在维基百科上发表文章 - java cloning disadvantage and alternative

答案 4 :(得分:0)

我认为这是制作数组副本的最佳方法

int[] b = Arrays.copyOf(a, a.length);