首页 > 试题广场 >

java语言的下面几种数组复制方法中,哪个效率最高?

[单选题]
java语言的下面几种数组复制方法中,哪个效率最高?
  • for 循环逐一复制
  • System.arraycopy
  • Array.copyOf
  • 使用clone方法
看了几个评论,你们会就好好回答,不会就别复制别人错误答案耽误别人好吧? 复制的效率System.arraycopy>clone>Arrays.copyOf>for循环,这个有兴趣自己测试一下就知道了。这里面在System类源码中给出了arraycopy的方法,是native方法,也就是本地方法,肯定是最快的。而Arrays.copyOf(注意是Arrays类,不是Array)的实现,在源码中是调用System.copyOf的,多了一个步骤,肯定就不是最快的。前面几个说System.copyOf的不要看,System类底层根本没有这个方法,自己看看源码就全知道了。
发表于 2017-07-10 20:34:16 回复(35)
System.arraycopy>使用clone方法>Array.copyOf>for 循环逐一复制 
发表于 2017-09-21 14:32:32 回复(0)
摘在Arrays.class
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

发表于 2017-07-19 14:38:10 回复(0)
JAVA复制的效率
发表于 2017-03-03 19:52:10 回复(0)



总结: 
(1)从速度上看:System.arraycopy > clone > Arrays.copyOf > for 
(2)for的速度之所以最慢是因为下标表示法每次都从起点开始寻位到指定下标处(现代编译器应该对其有进行优化,改为指针),另外就是它每一次循环都要判断一次是否达到数组最大长度和进行一次额外的记录下标值的加法运算。 
(3)查看Arrays.copyOf的源码可以发现,它其实本质上是调用了System.arraycopy。之所以时间差距比较大,是因为很大一部分开销全花在了Math.min函数上了。


public static byte[] copyOf(byte[] original, int newLength) { byte[] copy = new byte[newLength];
    System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy;
}
  • 1
  • 2
  • 3
  • 4
  • 5

(4)查看System.arraycopy的源码,可以发现它实质上是通过Jni调用本地方法,及c/c++已经编译成机器码的方法,所以快。

public static native void arraycopy(Object src, int srcPos,
                                        Object dest, int destPos, int length);
  • 1
  • 2
  • 3

(5)clone的源码不详,鄙人无法比较

发表于 2018-02-25 12:26:21 回复(9)
效率:System.arraycopy > clone > System.copyOf > for循环
发表于 2016-12-22 09:13:34 回复(26)
我来简略说说吧:
  1. System.arraycopy():native方法+JVM手写函数,在JVM里预写好速度最快
  2. clone():native方法,但并未手写,需要JNI转换,速度其次
  3. Arrays.copyof():本质是调用1的方法
  4. for():全是深复制,并且不是封装方法,最慢情有可原
更详细解释可以看看我写的博客:
如果想了解的更深,可以看看大佬的说法(PS:反正我看不懂)

System.arraycopy()
clone():
发表于 2019-07-24 23:06:26 回复(1)
http://blog.csdn.net/tingzhiyi/article/details/52344845
写的不错
编辑于 2020-07-11 17:39:17 回复(17)
System.arraycopy(浅拷贝) 这个是系统提供的拷贝方式,也是我们推荐使用的拷贝方式,它是浅拷贝,也就是说对于非基本类型而言,它拷贝的是对象的引用,而不是去新建一个新的对象。通过它的代码我们可以看到,这个方法不是用java语言写的,而是底层用c或者c++实现的,因而速度会比较快。 public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length); 通过源代码我们可以看到,关键字native说明它不是用java语言写的,而是调用其他语言的代码。 Arrays.copyOf(浅拷贝) 这个方法也是浅拷贝,为什么呢?我们看一下它的源代码就知道了。 public static byte[] copyOfRange(byte[] original, int from, int to) { int newLength = to - from; if (newLength < 0) throw new IllegalArgumentException(from + " > " + to); byte[] copy = new byte[newLength]; System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); return copy; } 实际上它调用的就是System.arraycopy,所以肯定也是浅拷贝。
发表于 2017-07-27 23:06:40 回复(1)
  1. System.arraycopy():native方法+JVM手写函数,在JVM里预写好速度最快
  2. clone():native方法,但并未手写,需要JNI转换,速度其次
  3. Arrays.copyof():本质是调用1的方法
  4. for():全是深复制,并且不是封装方法,最慢情有可原
发表于 2021-12-05 09:20:56 回复(0)
当我还年幼的时候,我很任性,复制数组也是,写一个for循环,来回倒腾,后来长大了,就发现 System.arraycopy的好处,可以看出,System.arraycopy的性能很不错,这个底层是如何处理的?找到openJDK的一些代码可知: System.arraycopy是一个native函数,需要看native层的代码:直接就是内存块赋值的逻辑了,这样避免很多引用来回倒腾的时间,必然就变快了。而其他方法都是玩的引用的游戏,所以效率没有直接在内存中操作来的高!
发表于 2017-06-21 17:48:41 回复(1)
看完评论,我知道了原来顺序是这样的;
System.arraycopy>clone>Arrays.copyOf>for
至于具体的原因:
1.主要认为System.arraycopy是在系统底层操作,本地方法;
2.克隆主要都不太了解
3.Arrays工具类被for快就对了,不然怎么当工具使
发表于 2018-09-16 10:41:11 回复(1)
复制的方法:
1.for循环逐一复制
2.System.arraycopy
3.Arrays.copyOf
4.使用Clone方法
使用效率:System.arraycopy>clone>Arrays.copyOf>for逐一循环

发表于 2017-05-15 10:16:15 回复(1)
拓展一下,arraycopy方法,它是最高效的,因为它使用了本地代码,但很多伙伴还不知道什么叫做本地代码,现在给大家介绍一下: 本地代码(Native Code)是指在计算机的本地平台上运行的机器码,它通常是由其他语言(如C、C++、汇编语言等)编写的,并且可以被Java程序调用。在Java中,可以使用本地代码来提高程序的性能和功能,因为本地代码可以直接访问底层系统资源和硬件,而且可以使用底层语言的特性来实现高效的算法和数据结构。
编辑于 2023-06-24 13:03:44 回复(0)
效率:System.arraycopy > clone > Arrays.copyOf > for循环
发表于 2022-05-06 13:06:19 回复(0)
数组复制的效率System.arraycopy>clone>Arrays.copyOf>for循环, 在System类源码中给出了arraycopy的方法,是native方法,也就是本地方法,是最快的。 而Arrays.copyOf(注意是Arrays类,不是Array)的实现,在源码中是调用System.copyOf的,多了一个步骤,肯定就不是最快的。
发表于 2021-10-31 20:50:01 回复(0)
效率:System.arraycopy > clone > Arrays.copyOf > for循环
发表于 2021-05-26 16:37:47 回复(0)
在system类中arraycopy要大于clone大于array.copyof
发表于 2021-05-25 18:15:37 回复(0)
代码:
package com.njcx.shuati;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class ShuaTi {

	public static void main(String[] args) {
		int[] arr = new int[10000000];
		int[] descArr = new int[arr.length];
		// System.arraycopy(src, srcPos, dest, destPos, length);

		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) Math.random() * 10000;
		}

		long date1 = System.currentTimeMillis();

		System.arraycopy(arr, 0, descArr, 0, arr.length);

		long date2 = System.currentTimeMillis();
		System.out.print("arrayCopy花费时间:");
		System.out.println(date2 - date1);

		int[] descArr2 = arr.clone();

		long date3 = System.currentTimeMillis();
		System.out.print("clone花费时间:");
		System.out.println(date3 - date2);

		int[] descArr3 = Arrays.copyOf(arr, arr.length);

		long date4 = System.currentTimeMillis();
		System.out.print("copyOf花费时间:");
		System.out.println(date4 - date3);

	}

}
运行结果:
arrayCopy花费时间:8
clone花费时间:30
copyOf花费时间:31



编辑于 2020-12-03 22:13:20 回复(0)
效率:System.arraycopy > clone > Arrays.copyOf > for循环
发表于 2020-07-01 04:25:32 回复(0)