美文网首页
复制数组的 System.arraycopy() 方法

复制数组的 System.arraycopy() 方法

作者: tingshuo123 | 来源:发表于2018-07-07 23:52 被阅读0次

方法描述:
void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);

参数:
src:源数组;
srcPos:源数组要复制的起始位置;
dest:目的数组;
destPos:目的数组放置的起始位置;
length:复制的长度;

简单的描述诉这方法的作用就是,从源数组 src 的 srcPos 位置拷贝length长度 的数据(length个元素)到目标数组 dest 的 destPos 位置,因为此方法是由C/C++实现的,效率极高,JDK中有关于集合,数组的拷贝操作底层基本上调用的都是此方法。

使用这是函数时特别要注意的是:
1、容易发生越界:函数本身并不会检查目标数组容量是否足够,很容易引起下标越界,使用时最好先对参数做检查。
2、浅拷贝:由于它的复制是浅拷贝(shallow copy),如果数组里面的是可变对象,因为复制后的数组与原数组引用的时同一个位置。修改一个数组的数据会引起另外一个数组的数据发生改变。

写了个Demo验证

package list;

import set.Person;

public class SystemArraycopyDemo {
    
    public static void main(String[] args) {
        
        int[] arr1 = new int[] {1, 2, 3, 4, 5};
        int[] arr2 = new int[arr1.length];
        
        System.arraycopy(arr1, 0, arr2, 0, arr1.length);
        arr1[1] = 3;
        // int 是常量,不会发生变化
        System.out.printf("arr1[1] = %d, arr[1] = %d\n", arr1[1], arr2[1]);  // 3, 2
        
        Person[] arr3 = new Person[] {new Person("任十七")};
        Person[] arr4 = new Person[arr3.length];
        
        System.arraycopy(arr3, 0, arr4, 0, arr3.length);
        arr3[0].setName("天剑老人");
        // 因为 Person 的实例是可变的对象,所以会影响另一个数组的
        System.out.printf("arr3[0].name = %s, arr4[0].name = %s\n", arr3[0].getName(), arr4[0].getName());
    }
}

Demo中用到的 Person 类

package set;

import java.util.Objects;

public class Person {
    
    private String name;
    
    public Person() {
        
    }
    public Person(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

结果

结果

相关文章

网友评论

      本文标题:复制数组的 System.arraycopy() 方法

      本文链接:https://www.haomeiwen.com/subject/etjnuftx.html