各种Array复制方法之间的区别

有什么区别

  • System.arraycopy()
  • clone()
  • 通过迭代元素进行手动复制
  • Arrays.copyOf()
  • 刚做arraynew = arrayold

  • System.arraycopy()使用JNI(Java Native Interface)来复制一个数组(或部分数组),所以它非常快,你可以在这里确认;
  • clone()创建一个与旧数组具有相同特征的新数组,即相同大小,相同类型和相同内容。 有关clone一些实例,请参阅此处 ;
  • manual copying就是手动复制。 关于这种方法没什么可说的,除了很多人发现它是最高效的 。
  • arraynew = arrayold 复制数组; 它只是将arraynew 指向 arraynew的内存地址,换句话说,你只是指定对旧数组的引用
  • System.arraycopy()数据从一个现有数组复制到另一个数组中,并且根据参数仅复制其中的一部分。
  • clone()分配一个与原始数组相同类型和大小的新数组,并确保它具有相同的内容。
  • 手动复制通常与System.arraycopy() ,但代码更多,因此错误的来源更大
  • arraynew = arrayold仅将对数组的引用复制到新变量,并且不会影响数组本身

还有一个有用的选择:

Arrays.copyOf()可用于创建具有不同大小的另一个数组的副本。 这意味着新arrays可以比原始arrays更大或更大,并且通用大小的内容将是源的内容。 甚至还有一个版本可以创建不同类型的数组,以及一个可以指定要复制的元素范围的版本( Array.copyOfRange() )。

请注意,所有这些方法都会生成浅表副本。 这意味着只复制存储在数组中的引用,并且不会复制引用的对象。

Arrays.copyOf(..)在内部使用System.arrayCopy(..)方法。

有答案,但不完整。

考虑的选项是

  • Arrays.copyOf()
  • System.arraycopy()

下面是Arrays.copyOf()的java实现

 public static double[] More ...copyOf(double[] original, int newLength) { double[] copy = new double[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } 

如您所见,copyOf在内部使用System.arraycopy。

  • 如果已经创建了一个数组,请使用System.arraycopy()进行复制
  • 如果需要在新数组中使用结果,请使用Arrays.copyOf()进行复制

注意:明显比较速度没有意义,因为它们的function不同。