各种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不同。