Android之路

导航

关于Java中的数组复制函数System.arraycopy()

    System.arraycopy()是Java系统提供的用于数组复制的函数。了解该函数前,先了解以下概念。

1、Java中的深复制和浅复制:

深复制:可以复制对象的内容和引用。例如:值拷贝。
浅复制:仅复制对象的引用。例如:对象拷贝(拷贝的是地址)。

2、函数原型:

public static native void arraycopy(Object src, int srcPos,
                Object dst, int dstPos, int length);
src:原数组对象
srcPos:copy的起始位置
dst:目标数组对象
dstPos:copy到目标的起始位置
length:copy的长度

  arraycopy()是System提供一个native静态方法,用于数组之间的复制。根据数据中数据类型的不同进行不同的处理,分为值拷贝(基本类型)和对象拷贝(普通类型,即对象类型)
该方法针对数据类型为基本类型的一维数组进行的是深复制;而二维数组或数据为引用类型的一维数据来说,进行的是浅复制。【因二维数组的元素类型是数组类型,而数组类型也是引用类型】
  由于上述方法是在JVM中直接执行的,因此其比for循环和clone更加高效。
3、Java中复制数组的几种方法:

(1)for遍历
(2)数组clone():

    int[]a = new int[]{1,2,3};
    int[]b = a.clone();

(3)System.arraycopy()
(4)Arrays.copyof():源码中,实际最终调用的还是System.arraycopy()。

4、补充:

  若自定义一个类,想调用Object的super.clone()方法,则该类必须实现Cloneable接口。

// Object.java源码如下:
protected Object clone() throws CloneNotSupportedException {
        if (!(this instanceof Cloneable)) {   //非Cloneable实例,抛出异常 
            throw new CloneNotSupportedException("Class " + getClass().getName() +
                                                 " doesn't implement Cloneable");
        }

        return internalClone();   //native方法
}

private native Object internalClone();

5、Java设计模式中的"原型模式"会用到上述clone()。

  

 

posted on 2019-07-30 18:04  Android之路  阅读(1602)  评论(0编辑  收藏  举报