方法描述:
void arraycopy(Object src,int srcPos,Object dest,int destPos,int length);
參數(shù):
src
:源數(shù)組;
srcPos
:源數(shù)組要復(fù)制的起始位置;
dest
:目的數(shù)組梭纹;
destPos
:目的數(shù)組放置的起始位置恋技;
length
:復(fù)制的長度;
簡單的描述訴這方法的作用就是,從源數(shù)組 src 的 srcPos 位置拷貝length長度 的數(shù)據(jù)(length個元素)到目標(biāo)數(shù)組 dest 的 destPos 位置崇裁,因為此方法是由C/C++實現(xiàn)的匕坯,效率極高,JDK中有關(guān)于集合拔稳,數(shù)組的拷貝操作底層基本上調(diào)用的都是此方法葛峻。
使用這是函數(shù)時特別要注意的是:
1、容易發(fā)生越界:函數(shù)本身并不會檢查目標(biāo)數(shù)組容量是否足夠巴比,很容易引起下標(biāo)越界术奖,使用時最好先對參數(shù)做檢查。
2轻绞、淺拷貝:由于它的復(fù)制是淺拷貝(shallow copy)采记,如果數(shù)組里面的是可變對象,因為復(fù)制后的數(shù)組與原數(shù)組引用的時同一個位置政勃。修改一個數(shù)組的數(shù)據(jù)會引起另外一個數(shù)組的數(shù)據(jù)發(fā)生改變唧龄。
寫了個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 是常量,不會發(fā)生變化
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 的實例是可變的對象奸远,所以會影響另一個數(shù)組的
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;
}
}