Java 不同数组复制方法之间的差异
两者的区别是什么Java 不同数组复制方法之间的差异,java,arrays,Java,Arrays,两者的区别是什么 System.arraycopy() clone() 通过迭代元素进行手动复制 Arrays.copyOf() 而仅仅是做arraynew=arrayold System.arraycopy()使用JNI(Java本机接口)进行复制 数组(或其一部分),因此 如你所证实的,速度惊人 ; clone()创建一个新的数组,该数组具有与旧数组相同的特征,即相同的大小、相同的类型和相同的内容。有关克隆的一些示例,请参阅 手动复制就是手动复制。关于这种方法没有什么可说的,只是很多人发
System.arraycopy()
clone()
- 通过迭代元素进行手动复制
Arrays.copyOf()
- 而仅仅是做
arraynew=arrayold
使用JNI(Java本机接口)进行复制 数组(或其一部分),因此 如你所证实的,速度惊人 ;李>System.arraycopy()
创建一个新的数组,该数组具有与旧数组相同的特征,即相同的大小、相同的类型和相同的内容。有关clone()
可以(理论上,并且出于明显的原因)由运行时专门处理,以精确执行克隆的一些示例,请参阅李>
就是手动复制。关于这种方法没有什么可说的,只是很多人发现它是最有效的手动复制
不复制数组;它只是将arraynew=arrayold
指向arraynew
的内存地址,或者换句话说,您只是将引用分配给旧数组arrayold
- 将数据从一个现有数组复制到另一个数组中,并根据参数仅复制其中的一部分
分配一个类型和大小与原始数组相同的新数组,并确保其内容相同clone()
- 手动复制通常与
做的事情几乎相同,但它是更多的代码,因此是更大的错误源System.arraycopy()
仅将对数组的引用复制到新变量,不影响数组本身arraynew=arrayold
- Arrays.copyOf()
- System.arraycopy()
- 如果已经创建了数组,请使用System.arraycopy()进行复制
- 如果需要新数组中的结果,请使用Arrays.copyOf()进行复制
请注意,所有这些方法都会生成浅拷贝。这意味着只复制存储在数组中的引用,而不复制引用的对象。数组。copyOf(..)在内部使用System.arrayCopy(..)方法。有答案,但不完整 考虑的方案有:
注意:由于它们的功能不同,因此没有必要对速度进行明显的比较。那篇关于
的文章是在2006年写的<代码>克隆arraycopy
。memcpy
之后是清除每个数组元素标头中“lock”位的过程。没有理由认为memcpy
和arraycopy
的性能应该不同。@me:关于锁定位的部分是假设您可以像在.NET中一样锁定Java中的任何对象。+1。但是,您可以澄清什么是浅拷贝(例如,多维数组的克隆是浅拷贝,也就是说它只创建一个新数组。子数组是共享的。)。@280Z28:clone
可以是特殊情况,与arraycopy
相同@JG:所有这些方法都会创建浅拷贝(除了手动拷贝,具体取决于操作方式)。@Joachim:clone
由于初始化目标数组的元素,然后立即写回它们,因此会产生不必要的开销<代码>克隆应该是最快的,因为它不需要初始化内存arraycopy
通过分配未初始化的内存并将数组子范围浅拷贝到内存中,总体上速度最快。所有这些都应该由运行时本身实现,这意味着没有JNI(低于JNI-JIT可以检测到这些调用并用机器代码处理它们)。与cloneRange
相比,.clone()
的性能如何?System.arraycopy()
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; }