【问题标题】:What is the fastest way to copy a 2D int array in Java?在 Java 中复制 2D int 数组的最快方法是什么?
【发布时间】:2014-07-15 23:46:26
【问题描述】:

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

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];
    }
}

有没有更快的方法?

【问题讨论】:

  • 按照你的做法,如果你删除original 数组,copy 也会为空。您只是在复制引用,而不是值。
  • @HugoSousa,不,我不这么认为。数组元素实际上被复制了。
  • 你为什么不看看Arrays.copyOf() 的源代码,看看它是如何完成的呢?这可能是你能得到的最好的。
  • @PM77-1,这不是讨论的重点吗?假设问题陈述中不存在的东西有什么意义。
  • @OP,为什么你认为你当前的实现很慢?你做过基准测试吗?

标签: java arrays copy 2d


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    Java 是 JIT 编译的,本地代码编译器可以做各种聪明的事情来使简单的循环运行得更快。因此,arraycopy 的实现并不明显会产生显着差异。

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

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

    【讨论】:

      【解决方案3】:

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

      如果您只是将数据存储在新阵列上,因为您使用的阵列已满,这意味着步骤如下: 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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-08
        • 1970-01-01
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 2023-03-29
        相关资源
        最近更新 更多