我有一个带有方法
的接口DataSeries
int[] getRawData();
由于各种原因(主要是因为我在MATLAB中使用它,MATLAB处理int [])我需要返回一个数组而不是List。
我不希望我的实现类返回int []数组,因为它是可变的。复制int []数组的最有效方法是什么(1000-1000000长度范围内的大小)?是clone()
吗?
答案 0 :(得分:7)
唯一的选择是Arrays#copyOf()
(在引擎盖下使用System#arrayCopy()
)。
试试吧。
package com.stackoverflow.q2830456;
import java.util.Arrays;
import java.util.Random;
public class Test {
public static void main(String[] args) throws Exception {
Random random = new Random();
int[] ints = new int[100000];
for (int i = 0; i < ints.length; ints[i++] = random.nextInt());
long st = System.currentTimeMillis();
test1(ints);
System.out.println(System.currentTimeMillis() - st);
st = System.currentTimeMillis();
test2(ints);
System.out.println(System.currentTimeMillis() - st);
}
static void test1(int[] ints) {
for (int i = 0; i < ints.length; i++) {
ints.clone();
}
}
static void test2(int[] ints) {
for (int i = 0; i < ints.length; i++) {
Arrays.copyOf(ints, ints.length);
}
}
}
20203 20131
当交换test1()
和test2()
时:
20157 20275
差异可以忽略不计。我会说,只需要clone()
,因为它更易读,Arrays#copyOf()
只是Java 6。
注意:实际结果可能取决于所使用的平台和JVM,这是在Dell Latitude E5500上测试的,配备Intel P8400,4GB PC2-6400 RAM,WinXP,JDK 1.6.0_17_b04
答案 1 :(得分:7)
没有人通过遍历和更改对clone()的arraycopy()调用来解决他们应用程序的性能问题,反之亦然。
这个问题没有一个确定的答案。不仅可能在不同的VM,版本,操作系统和硬件上有所不同:它真的
无论如何,我在最近的一个OpenJDK(在最近的ubuntu上)对它进行了基准测试,发现arraycopy
很多更快。这是我给你的答案吗?没有!因为如果它被证明是真的,那么Arrays.copyOf
的内在化存在一个错误,并且该错误可能会得到修复,因此这些信息对您来说只是暂时的。
答案 2 :(得分:1)
http://www.javapractices.com/topic/TopicAction.do?Id=3
根据您的规格,数字可能会有所不同,但似乎克隆是最佳选择。