Java中数组复制的四种方法

for()循环方法

代码灵活,但效率低。

System.arraycopy()方法(推荐使用)

该方法是浅拷贝,也就是说对于非基本类型而言,拷贝的是对象的引用,而不是去新建一个新的对象。
通过源码可以看到,其为 native方法,即原生态方法,是调用底层的 C 或者 C++ 实现的,自然效率更高。

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

Arrays.copyOf()方法

同样看源码,它的实现还是基于 System.arraycopy(),所以效率自然低于 System.arraycpoy()。 同样,这个方法也是浅拷贝。

    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;
    }

Object.clone()方法

该方法比较特殊,对于对象而言,它是深拷贝,但是对于数组而言,它是浅拷贝
从源码来看是 native 方法,所以是调用了 C 或者 C++ 代码。

    protected native Object clone() throws CloneNotSupportedException;

方法性能测试比较

import java.util.Arrays;
import java.util.Random;

/**
 * 数组复制的方法比较
 *
 * @author TinyDolphin
 *         2017/11/1 15:40.
 */
public class Main {
    public static void main(String[] args) {
        // int length = 10000000;    // 千万级别
        int length = 8000000;        // 百万级别
        Integer[] arr = new Integer[length];
        Integer[] arr2 = new Integer[length];
        for (int index = 0; index < length; index++) {
            arr[index] = new Random().nextInt(length) + 1;
        }

        // for() 循环方法
        long start = System.currentTimeMillis();
        for (int index = 0; index < length; index++) {
            arr2[index] = arr[index];
        }
        long end = System.currentTimeMillis();
        System.out.println("for()循环方法耗费时间:" + (end - start) + "ms");

        // Object.clone() 方法
        start = System.currentTimeMillis();
        arr2 = arr.clone();
        end = System.currentTimeMillis();
        System.out.println("Object.clone()方法耗费时间:" + (end - start) + "ms");

        // Arrays.copyOf() 方法
        start = System.currentTimeMillis();
        arr2 = Arrays.copyOf(arr, length);
        end = System.currentTimeMillis();
        System.out.println("Arrays.copyOf()方法耗费时间:" + (end - start) + "ms");

        // System.arraycopy() 方法
        start = System.currentTimeMillis();
        System.arraycopy(arr, 0, arr2, 0, length);
        end = System.currentTimeMillis();
        System.out.println("System.arraycopy()方法耗费时间:" + (end - start) + "ms");
    }
}

数据量百万级别的情况下:

百万级别测试结果

数据量是千万级别的情况下:

千万级别测试结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,405评论 25 708
  • 下班的打卡声 挤过了人群 出站口,凝望天空 晚七点五十,天还没黑
    郭青年阅读 229评论 0 1
  • 社会的进步,经济的繁荣,给了我们良好的生活条件,同时也使我们的工作压力和生活压力加大,进而影响我们的情绪和身体健康...
    安好007阅读 25,314评论 0 5
  • 在疗愈水晶的世界中,有些特别的水晶伙伴被归类为大师水晶的行列,它们以完美的形态存在,显现与光之源的合一。每一颗大师...
    GaiaMama阅读 20,164评论 0 30