在Java中复制2D int数组的最快方法是什么?

时间:2014-07-15 23:46:27

标签: java arrays copy 2d

我想在比N ^ 2成比例的时间内复制一个数组。我现在正在使用双循环...

int[][] copy = new int[N][N];
for(int i = 0; i < N; i++){
    for(int j = 0; j < N; j++){
        copy[i][j] = original[i][j];
    }
}

有更快的方法吗?

3 个答案:

答案 0 :(得分:0)

int[][] copy = new int[N][N];
for(int i = 0; i < N; i++){
    System.arrayCopy(original[i], 0, copy[i], 0, N);
}

http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#arraycopy(java.lang.Object,%20int,%20java.lang.Object,%20int,%20int)

答案 1 :(得分:0)

Java是JIT编译的,本机代码编译器可以做各种聪明的事情来简化循环。因此,arraycopy的实现并没有明显的区别。

所以@Brett Okken提供的答案不一定要比你的快。但要“确定”你可以用自己的方式。这是“最快的”。

System.arrayCopy(original[i], 0, copy[i], 0, N);

答案 2 :(得分:0)

我知道我迟到了,但也许这对大多数人有用:

如果您只是将数据存储在新阵列上,因为您使用的阵列已满,这意味着步骤如下: 1 - 分配一个新的更大的数组; 2 - 将旧数组中的值复制到新数组中; 3 - 将变量“指向”新数组。

我见过这个算法:

int[][] newArray = new int[oldArray.length + 1][];
for (int n = oldArray.length; n-- != 0; newArray[n] = oldArray[n]) {}
oldArray = newArray;

这里的想法不是复制值,而是“指向”它们,当更大的结构是 3d 数组时,这特别有用。似乎这个算法是最快的。 如果您不想更改初始数组,这没有用,因为很明显,选项是发送原始数组的副本。

必须提到的是,我看到了这段代码,或者在名为“fastUtil”的 API 中看到了一些接近的东西。它可用 here

如果我说了什么废话,请随时纠正我。