arraycopy()解析
该方法的声明是:
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
该方法的功能是:从指定的源数组复制数组,从指定的位置开始复制到目标数组的指定位置
- 当复制的元素是基础类型时,只是复制数组元素变量的值。
- 但如果复制的对象是引用类型(比如,二维数组中的元素——数组,应该是引用类型的),引用类型存的是所指对象的内存地址,它实际上只是把内存地址赋值了。
也就是说,如果你的对象都是同一地址,那么改变该地址的值,另外一个同地址的对象也会改变。比如 List a = new ArrayList(); a.add(“a”);List b=a;b.add(“b”);
System.out.println(a);//output:[a,b]这里边的a、b就是同一地址;但是有赋值的则不会如此:String a=“a”;Stringb=a;b=“b”;
System.out.println(a);//output:a这里边b的引用虽然指向了a但是后来的赋值让它指向了新的内容,没有改变原来地址的值;所以a没有改变。
看下面一段代码:
public class TestArrayCopy {
public static void main(String args[]) {
//int类型 一维数组
int[] a = {1, 2, 3};
int[]acopy = new int[3];
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
System.arraycopy(a,0,acopy,0,3);
for(int i=0;i<acopy.length;i++){
System.out.print(acopy[i]+" ");
}
System.out.println();
acopy[2] = 4;
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
for(int i=0;i<acopy.length;i++){
System.out.print(acopy[i]+" ");
}
System.out.println();
//String类型 一维数组
String[] s =
{"Mircosoft","IBM","Sun","Oracle","Apple"};
String[] sBak = new String[6];
System.arraycopy(s,0,sBak,0,s.length);
for(int i=0;i<sBak.length;i++){
System.out.print(sBak[i]+" ");
}
System.out.println();
sBak[2] = "XiaoMi";
for(int i=0;i<sBak.length;i++){
System.out.print(sBak[i]+" ");
}
System.out.println();
for(int i=0;i<s.length;i++){
System.out.print(s[i]+" ");
}
System.out.println();
//int类型 二维数组
int[][] intArray = {{1,2},{1,2,3},{3,4}};
int[][] intArrayBak = new int[3][];
System.arraycopy
(intArray,0,intArrayBak,0,intArray.length);
intArrayBak[2][1] = 100;
for(int i = 0;i<intArray.length;i++){
for(int j =0;j<intArray[i].length;j++){
System.out.print(intArray[i][j]+" ");
}
System.out.println();
}
for(int i = 0;i<intArrayBak.length;i++){
for(int j =0;j<intArrayBak[i].length;j++){
System.out.print(intArrayBak[i][j]+" ");
}
System.out.println();
}
}
}
输出结果是:
E:\java\javademo\Array>java TestArrayCopy
1 2 3
1 2 3
1 2 3
1 2 4
Mircosoft IBM Sun Oracle Apple null
Mircosoft IBM XiaoMi Oracle Apple null
Mircosoft IBM Sun Oracle Apple
1 2
1 2 3
3 100
1 2
1 2 3
3 100