26
2017
09

数组的拷贝

1.前言

  • java数组拷贝主要有四种方法,分别是循环赋值,System.arraycopy(), Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法。
  • Java数组的复制操作可以分为深度复制和浅度复制。简单来说深度复制,可以将对象的值和对象的内容复制;浅复制是指对对象引用的复制。

2.代码详解

1. 循环拷贝(速度相对比较慢)
用一个for循环进行元素的逐个拷贝,进行深拷贝或者浅复制。

2. System.arraycopy(浅拷贝)
①系统提供的拷贝方式,也是我们推荐使用的拷贝方式,它是浅拷贝,也就是说对于非基本类型而言,它拷贝的是对象的引用,而不是去新建一个新的对象。通过它的代码我们可以看到,这个方法不是用java语言写的,而是底层用c或者c++实现的,因而速度会比较快。
②对于一维数组来说,这种复制属性值传递,修改副本不会影响原来的值。对于二维或者一维数组中存放的是对象时,复制结果是一维的引用变量传递给副本的一维数组,修改副本时,会影响原来的数组。

System.arraycopy的函数原型:

/** *src表示源数组 *srcPos表示源数组要复制的起始位置 *desc表示目标数组 *length表示要复制的长度 */
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length); 

System.arraycopy()复制的过程图

这里写图片描述

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

4.Object.clone
clone()比较特殊,对于对象而言,它是深拷贝,但是对于数组而言,它是浅拷贝。
①对象拷贝

因为protected关键字只允许同一个包内的类和它的子类调用,所以我们声明一个object类时,肯定不是同一个包内,所以就不能去调用它。
要调用这个方法,就需要我们写一个类,然后声明实现cloneable接口就好了,不需要去显示地声明继承于object,因为java中的类如果不显示说明父类的话,默认父类就是object。然后我们继承这个方法:

    @Override
    public Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }
上一篇:字符串连接用"+"和StringBuilder的append的区别 下一篇:retrofit(2017_09_22)