前文看了基本类型的二维数组的拷贝方式,本文我们来看看引用类型的二维数组的拷贝是怎样的。
1.for循环拷贝
看以下例子:
class Test{
private int data = 10;
public void setData(int data){
this.data = data;
}
public int getData(){
return data;
}
}
public class Demo {
public static void printArray(Test[][] array){
for(int i = 0;i < array.length;i++){
for(int j = 0;j < array[i].length;j++){
System.out.print(array[i][j].getData()+" ");
}
System.out.println();
}
}
public static void main(String[] args) {
Test[][] data1 = new Test[2][3];
for(int i = 0;i < data1.length;i++){
for(int j = 0;j < data1[i].length;j++){
data1[i][j] = new Test();
}
}
Test[][] data2 = new Test[2][3];
System.out.println(data2);
System.out.println(data2[0]);
System.out.println("==========");
for(int i = 0;i < data1.length;i++){
for(int j = 0;j < data1[i].length;j++){
data2[i][j] = data1[i][j];
}
}
System.out.println(data1);
System.out.println(data2);
System.out.println("==========");
System.out.println(data1[0]);
System.out.println(data2[0]);
printArray(data1);
System.out.println("==========");
printArray(data2);
System.out.println("==========");
data2[0][0].setData(1000);
printArray(data1);
System.out.println("==========");
printArray(data2);
}
}
以上程序的输出结果是:
[[Lcom.data.Test;@4e25154f
[Lcom.data.Test;@70dea4e
==========
[[Lcom.data.Test;@5c647e05
[[Lcom.data.Test;@4e25154f
==========
[Lcom.data.Test;@7852e922
[Lcom.data.Test;@70dea4e
10 10 10
10 10 10
==========
1000 10 10
10 10 10
==========
1000 10 10
10 10 10
内存分析:
2.clone()方法拷贝方式1
看以下例子:
class Test{
private int data = 10;
public void setData(int data){
this.data = data;
}
public int getData(){
return data;
}
}
public class Demo {
public static void printArray(Test[][] array){
for(int i = 0;i < array.length;i++){
for(int j = 0;j < array[i].length;j++){
System.out.print(array[i][j].getData()+" ");
}
System.out.println();
}
}
public static void main(String[] args) {
Test[][] data1 = new Test[2][3];
for(int i = 0;i < data1.length;i++){
for(int j = 0;j < data1[i].length;j++){
data1[i][j] = new Test();
}
}
Test[][] data2 = new Test[2][3];
System.out.println(data2);
System.out.println(data2[0]);
System.out.println("==========");
for(int i = 0;i < data1.length;i++){
data2[i] = data1[i].clone();
}
System.out.println(data1);
System.out.println(data2);
System.out.println("==========");
System.out.println(data2[0]);
System.out.println(data2[0]);
System.out.println("==========");
printArray(data1);
System.out.println("==========");
printArray(data2);
System.out.println("==========");
data2[0][0].setData(1000);
printArray(data1);
System.out.println("==========");
printArray(data2);
}
}
运行结果是:
[[Lcom.data.Test;@7852e922
[Lcom.data.Test;@4e25154f
==========
[[Lcom.data.Test;@70dea4e
[[Lcom.data.Test;@7852e922
==========
[Lcom.data.Test;@5c647e05
[Lcom.data.Test;@33909752
==========
10 10 10
10 10 10
==========
10 10 10
10 10 10
==========
1000 10 10
10 10 10
==========
1000 10 10
10 10 10
看一下内存分析:
3.clone()方法拷贝方式2
将上面的克隆语句:
for(int i = 0;i < data1.length;i++){
data2[i] = data1[i].clone();
}
换成下面的语句:
data2 = data1.clone();
结果是:
[[Lcom.data.Test;@7852e922
[Lcom.data.Test;@4e25154f
==========
[[Lcom.data.Test;@70dea4e
[[Lcom.data.Test;@5c647e05
==========
[Lcom.data.Test;@33909752
[Lcom.data.Test;@33909752
==========
10 10 10
10 10 10
==========
10 10 10
10 10 10
==========
1000 10 10
10 10 10
==========
1000 10 10
10 10 10
看一下内存分析: