今天在讀別人代碼的時候砚尽,發(fā)現(xiàn)了一個數(shù)組之間復(fù)制很不錯的方法,就分享記錄下吧辉词。同時小小的研究下了它的使用方法必孤。
System提供了一個靜態(tài)方法arraycopy(),我們可以使用它來實現(xiàn)數(shù)組之間的復(fù)制。其函數(shù)原型是:
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
src:源數(shù)組瑞躺;
srcPos:復(fù)制源數(shù)組的起始位置敷搪;
dest:目的數(shù)組;
destPos:放置目的數(shù)組的起始位置幢哨;
length:需要復(fù)制的長度赡勘。
注意:src 和 dest都必須是同類型或者可以進行轉(zhuǎn)換類型的數(shù)組。
1.一維數(shù)組的復(fù)制
函數(shù)也很好理解捞镰,直接上代碼吧闸与。
import java.util.Arrays;
public class MyClass {
public static void main(String[] args) {
int [] srcArray = new int []{0,1,2,3,4,5,6,7,8} ;
int [] destArray = new int [srcArray.length] ;
System.arraycopy(srcArray, 0, destArray, 0, srcArray.length) ;
System.out.println(Arrays.toString(srcArray));
System.out.println(Arrays.toString(destArray));
}
}
不僅如此,更加有趣的是這個函數(shù)可以實現(xiàn)自己到自己的復(fù)制曼振,比如:
import java.util.Arrays;
public class MyClass {
public static void main(String[] args) {
int [] srcArray = new int []{0,1,2,3,4,5,6,7,8} ;
System.out.println(Arrays.toString(srcArray));
System.arraycopy(srcArray, 0, srcArray , 3, 3) ;
System.out.println(Arrays.toString(srcArray));
}
}
則結(jié)果為:
實現(xiàn)過程是這樣的,先生成一個長度為length的臨時數(shù)組,將fun數(shù)組中srcPos到srcPos+length-1之間的數(shù)據(jù)拷貝到臨時數(shù)組中蔚龙,再執(zhí)行System.arraycopy(臨時數(shù)組,0,srcArray ,3,3)冰评。
2.一維數(shù)組的交換
其實從arraycopy()自我復(fù)制的例子就可以想到,只要借助于臨時數(shù)組木羹,就可以實現(xiàn)數(shù)組左邊和右邊的交換甲雅。
import java.util.Arrays;
public class MyClass {
public static void main(String[] args) {
int [] srcArray = new int []{0,1,2,3,4,5,6,7,8} ;
int [] destArray = new int[srcArray.length];
//從第3位開始數(shù)組左右交換
int index = 3;
System.arraycopy(srcArray, index, destArray, 0, srcArray.length-index);
System.arraycopy(srcArray, 0, destArray, srcArray.length-index, index);
System.out.println(Arrays.toString(srcArray));
System.out.println(Arrays.toString(destArray));
}
}
怎么樣,是不是看起來代碼很簡潔坑填,不需要調(diào)用for或者while循環(huán)去實現(xiàn)數(shù)組的交換啦抛人。
3.二維數(shù)組的復(fù)制
由于java沒有二維數(shù)組的概念,平常實現(xiàn)的二維數(shù)組只是元素是一維數(shù)組的一維數(shù)組脐瑰,而數(shù)組也是引用類型妖枚,繼承自O(shè)bject類。數(shù)組是new出來的苍在。這些性質(zhì)也就導致arraycopy()二維數(shù)組會出現(xiàn)問題绝页。這是個坑,不可大意寂恬。怎么樣一個坑呢续誉,我們來對比下一維數(shù)組復(fù)制和二維數(shù)組復(fù)制的代碼你就知道啦。
import java.util.Arrays;
public class MyClass {
public static void main(String[] args) {
int [] srcArray = new int []{0,1,2,3,4,5,6,7,8} ;
int [] destArray = new int [srcArray.length] ;
System.arraycopy(srcArray, 0, destArray, 0, srcArray.length) ;
System.out.println("srcArray:"+Arrays.toString(srcArray));
System.out.println("destArray:"+Arrays.toString(destArray));
destArray[0] = 9 ; destArray[1] = 9 ;
System.out.println("srcArray after changed value:"+Arrays.toString(srcArray));
System.out.println("destArray after changed value:"+Arrays.toString(destArray));
}
}
從結(jié)果中可以看出初肉,設(shè)置destArray[0] = 9 酷鸦,destArray[1] = 9 后,srcArray after changed value的結(jié)果并沒有改變,僅僅只有destArray after changed value的結(jié)果改變臼隔。所以有如下結(jié)論:
**
在一維數(shù)組中嘹裂,元素都是基礎(chǔ)類型(如int,double等)躬翁,使用arraycopy()方法后焦蘑,是把原數(shù)組的值傳給了新數(shù)組,屬于值傳遞盒发。
**
接下來我們看看二維數(shù)組的復(fù)制代碼:
import java.util.Arrays;
public class MyClass {
public static void main(String[] args) {
char [][]one = new char[][]{{'a','b'},{'c','d'},{'e','f'}};
System.out.println("srcArray:"+Arrays.toString(one[0]));
char [][] another = new char [2][2] ;
System.arraycopy(one, 0, another, 0, 2) ;
System.out.println("destArray:"+Arrays.toString(another[0]));
one[0][0] = 'x' ; one[0][1] = 'y' ;
System.out.println("srcArray after changed value:"+Arrays.toString(one[0]));
System.out.println("destArray after changed value:"+Arrays.toString(another[0]));
}
}
從結(jié)果中可以看出例嘱,設(shè)置one[0][0] = 'x',one[0][1] = 'y' 后宁舰,srcArray after changed value的結(jié)果和destArray after changed value的結(jié)果相同拼卵。所以有如下結(jié)論:
**
二維數(shù)組使用arraycopy()方法后,第一維的引用被復(fù)制給新數(shù)組的第一維蛮艰,也就是兩個數(shù)組的第一維都指向相同的“那些數(shù)組”腋腮。而這時改變其中任何一個數(shù)組的元素的值,其實都修改了“那些數(shù)組”的元素的值壤蚜,所以原數(shù)組和新數(shù)組的元素值都一樣了即寡。
**
總結(jié):
1.一維數(shù)組的復(fù)制屬于值傳遞 ,修改副本原來的不會變
2.二維的數(shù)組袜刷,復(fù)制的結(jié)果是將源二維數(shù)組里一維數(shù)組的引用變量傳遞給副本聪富,修改任意一個數(shù)組的值,另一個數(shù)組的值也會相應(yīng)改變著蟹。也就是one[2][2]中墩蔓,one[i]是復(fù)制,one[i][j]是引用萧豆。