方法描述:
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;
}
}