【问题标题】:copying array by value in java在java中按值复制数组
【发布时间】:2010-03-03 13:25:49
【问题描述】:

我尝试制作一个数组的独立副本,但无法获得。请参阅由于效率原因,我无法使用 for 循环逐个整数地复制它。还有其他方法吗? 这是我的代码:

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

【问题讨论】:

  • 什么“效率原因”?你真的测试这段代码有问题吗?还是你只是在猜测?
  • 真的很奇怪的效率原因...

标签: java


【解决方案1】:

查看System.arraycopy() 方法。喜欢,

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

【讨论】:

    【解决方案2】:

    Arrays.copyOf() 创建一个现有数组的新副本(可以选择不同的长度)。

    【讨论】:

    • 请注意,此方法是 1.6 中的新方法,可以说比 System.arraycopy() 更易于使用
    • @matt:我不再提及“Java 6 中的新功能”,因为 Java 6 已经足够老了(2006 年 12 月已经过去了一段时间)。
    • 我并不是说这是不使用它的理由 - 只是提醒那些不熟悉它的人,因为他们没有使用 1.6
    【解决方案3】:

    尝试为此目的使用clone () 方法。我记得这是 Effective Java 中 Josh Bloch 建议使用克隆的唯一案例。

    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()”
    • 因为我先写了clone(),然后为了兴趣做了测试:)
    • 我无法重现结果,请参阅my micro-benchmark,这表明前 3 种方法是等效的。所以我更喜欢专门为该任务构建的Arrays.copyOf
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      您可以使用System.arraycopy,但我怀疑它会更有效。无论如何都必须复制内存,因此唯一可能的优化是一次复制更大的内存块。但是一次复制的内存块的大小受到处理器/系统架构的强烈限制。

      【讨论】:

      • 特别是对于大数组,该方法比简单的for循环实现要快很多。
      猜你喜欢
      • 2012-04-25
      • 2020-09-18
      相关资源
      最近更新 更多