java 基礎——二維陣列的拷貝
文章目錄
for 迴圈拷貝
基本型別
public static void main(String[] args) { int[][] array1 = {{10,10,10},{10,10,10}}; int[][] array2 = new int[2][3]; for(int i = 0;i < array1.length;i++){ for(int j = 0;j < array1[0].length;j++){ array2[i][j] = array1[i][j]; } } System.out.println("陣列1 "); show(array1); System.out.println("陣列2 "); show(array2); array2[0][0] = 30; System.out.println("===修改後==="); System.out.println("陣列1 "); show(array1); System.out.println("陣列2 "); show(array2); }
執行結果:
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[10,10,10,]
[10,10,10,]
=修改後=
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[30,10,10,]
[10,10,10,]
引用型別
public static void main(String[] args) { test[][] array1 = {{new test(),new test(),new test()}, {new test(),new test(),new test()}}; test[][] array2 = new test[2][3]; for(int i = 0;i < array1.length;i++){ for(int j = 0;j < array1[0].length;j++){ array2[i][j] = array1[i][j]; } } System.out.println("陣列1 "); show(array1); System.out.println("陣列2 "); show(array2); array2[0][0].setVal(30); System.out.println("===修改後==="); System.out.println("陣列1 "); show(array1); System.out.println("陣列2 "); show(array2); }
執行結果:
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[10,10,10,]
[10,10,10,]
=修改後=
陣列1
[30,10,10,]
[10,10,10,]
陣列2
[30,10,10,]
[10,10,10,]
clone 方式拷貝
基本型別
public static void main(String[] args) { int[][] array1 = {{10,10,10},{10,10,10}}; int[][] array2 = new int[2][3]; for(int i = 0;i < array1.length;i++){ array2[i] = array1[i].clone(); } System.out.println("陣列1 "); show(array1); System.out.println("陣列2 "); show(array2); array2[0][0] = 30; System.out.println("===修改後==="); System.out.println("陣列1 "); show(array1); System.out.println("陣列2 "); show(array2); }
執行結果:
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[10,10,10,]
[10,10,10,]
=修改後=
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[30,10,10,]
[10,10,10,]
引用型別
public static void main(String[] args) {
test[][] array1 = {{new test(),new test(),new test()},
{new test(),new test(),new test()}};
test[][] array2 = new test[2][3];
for(int i = 0;i < array1.length;i++){
array2[i] = array1[i].clone();
}
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
array2[0][0].setVal(30);
System.out.println("===修改後===");
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
}
執行結果:
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[10,10,10,]
[10,10,10,]
=修改後=
陣列1
[30,10,10,]
[10,10,10,]
陣列2
[30,10,10,]
[10,10,10,]
System.arraycopy()
基本型別
public static void main(String[] args) {
int[][] array1 = {{10,10,10},{10,10,10}};
int[][] array2 = new int[2][3];
for(int i = 0;i < array1.length;i++){
System.arraycopy(array1[i],0,array2[i],0,array1[i].length);
}
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
array2[0][0] = 30;
System.out.println("===修改後===");
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
}
}
執行結果:
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[30,10,10,]
[10,10,10,]
引用型別
public static void main(String[] args) {
test[][] array1 = {{new test(),new test(),new test()},
{new test(),new test(),new test()}};
test[][] array2 = new test[2][3];
for(int i = 0;i < array1.length;i++){
System.arraycopy(array1[i],0,array2[i],0,array1[i].length);
}
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
array2[0][0].setVal(30);
System.out.println("===修改後===");
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
}
執行結果:
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[10,10,10,]
[10,10,10,]
=修改後=
陣列1
[30,10,10,]
[10,10,10,]
陣列2
[30,10,10,]
[10,10,10,]
Arrays.copyOf()
基本型別
public static void main(String[] args) {
int[][] array1 = {{10,10,10},{10,10,10}};
int[][] array2 = new int[2][3];
for(int i = 0;i < array1.length;i++){
array2[i] = Arrays.copyOf(array1[i],array1[i].length);
}
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
array2[0][0] = 30;
System.out.println("===修改後===");
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
}
執行結果:
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[10,10,10,]
[10,10,10,]
=修改後=
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[30,10,10,]
[10,10,10,]
引用型別
public static void main1(String[] args) {
test[][] array1 = {{new test(),new test(),new test()},
{new test(),new test(),new test()}};
test[][] array2 = new test[2][3];
for(int i = 0;i < array1.length;i++){
array2[i] = Arrays.copyOf(array1[i],array1[i].length);
}
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
array2[0][0].setVal(30);
System.out.println("===修改後===");
System.out.println("陣列1 ");
show(array1);
System.out.println("陣列2 ");
show(array2);
}
執行結果:
陣列1
[10,10,10,]
[10,10,10,]
陣列2
[10,10,10,]
[10,10,10,]
=修改後=
陣列1
[30,10,10,]
[10,10,10,]
陣列2
[30,10,10,]
[10,10,10,]
總結
從上面幾個例子我們可以看出,基本型別的拷貝都是深拷貝,引用型別的拷貝都是淺拷貝,這點和一維陣列的拷貝沒差。
一維陣列的拷貝參考博文:java 基礎——一維陣列拷貝
關於深拷貝和淺拷貝也請參考上篇博文。