Java:防御性地复制int []的最有效方法?

时间:2010-05-13 21:29:53

标签: java arrays

我有一个带有方法

的接口DataSeries
int[] getRawData();

由于各种原因(主要是因为我在MATLAB中使用它,MATLAB处理int [])我需要返回一个数组而不是List。

我不希望我的实现类返回int []数组,因为它是可变的。复制int []数组的最有效方法是什么(1000-1000000长度范围内的大小)?是clone()吗?

3 个答案:

答案 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)

  1. 没有人通过遍历和更改对clone()的arraycopy()调用来解决他们应用程序的性能问题,反之亦然。

  2. 这个问题没有一个确定的答案。不仅可能在不同的VM,版本,操作系统和硬件上有所不同:它真的

  3. 无论如何,我在最近的一个OpenJDK(在最近的ubuntu上)对它进行了基准测试,发现arraycopy 很多更快。这是我给你的答案吗?没有!因为如果它被证明是真的,那么Arrays.copyOf的内在化存在一个错误,并且该错误可能会得到修复,因此这些信息对您来说只是暂时的。

答案 2 :(得分:1)

http://www.javapractices.com/topic/TopicAction.do?Id=3

根据您的规格,数字可能会有所不同,但似乎克隆是最佳选择。