在Java中按值复制数组

13

我试图创建一个独立的数组副本,但无法成功。我不能使用for循环逐个整数复制,因为效率原因。是否有其他方法? 这是我的代码:

int[] temp = new int[arr.length]; 
temp = arr; 

2
“效率原因”是什么?你真的测试过这段代码有问题吗?还是只是猜测而已? - Joachim Sauer
真的很奇怪的效率原因... - Peter Perháč
5个回答

21

看看 System.arraycopy() 方法。就像这样,

int[] b = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length);

14

Arrays.copyOf()可以创建一个已存在数组的副本(可选择使用不同的长度)。


1
请注意,这种方法是1.6中的新方法,可以说比System.arraycopy()更容易使用。 - matt b
@matt:我不再提及“Java 6中的新功能”了,因为Java 6已经足够老了(2006年12月已经过去了一段时间)。 - Joachim Sauer
我并不是因此不建议使用它,只是提醒那些因为未使用1.6而不熟悉它的人们注意。 - matt b

6
尝试使用clone()方法来实现此目的。据我记得,这是唯一一种Josh Bloch在《Effective Java》中推荐使用克隆的情况。
int[] temp = arr.clone ();

然而,arrayCopy 的速度要快得多。对于包含 3,000,000 个元素的数组进行性能测试:

System.arrayCopy time: 8ms
     arr.clone() time: 29ms
 Arrays.copyOf() time: 49ms
 simple for-loop time: 75ms

不错的统计数据,但这引出了一个问题,为什么他应该“尝试使用clone()”? - Draemon
1
因为我先写了关于clone()的内容,然后出于兴趣进行了测试 :) - Roman
我无法重现结果,请查看我的微基准测试,它显示前三种方法是等效的。因此,我更喜欢专门为此任务构建的Arrays.copyOf - assylias

4

请查看System.arraycopy()。它可以复制任何类型的数组,并且是复制数组的首选(并优化)方式。


1

你可以使用System.arraycopy,但我怀疑它不会更有效率。无论如何,内存都必须被复制,所以唯一可能的优化是一次性复制更大的内存块。但一次复制的内存块大小受处理器/系统架构的严格限制。


特别是对于大数组,该方法比简单的for循环实现要快得多。 - Joachim Sauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接