直接子数组副本与2-D数组与Java中的循环使用之间有任何功能差异



我已经编写了2件代码,以复制下面的2-D数组的子阵列元素

第一个方法:

 String [][] actual = new String[5][5];
 String [] arrayToCopy = {"1","2","3","4","5"};
 actual[0] = arrayToCopy;

第二种方法:

String [][] actual = new String[5][5];
String [] arrayToCopy = {"1","2","3","4","5"};
for(int i=0;i<5;i++)
    actual[0][i] = arrayToCopy[i];

我打印2-D数组时,两种方法之间的功能有所不同?

您需要担心的一个区别是,当您说

actual[0] = arrayToCopy;

您实际上不是"复制"您的数组。相反,您正在替换actual[0] 引用arrayToCopy。如果将数组从两个变量更改,则更改将反映在另一个变量中。您可以自己看到它:

System.out.println(actual[0][0]);   // prints "1"
arrayToCopy[0] = "5";
System.out.println(actual[0][0]);   // prints "5"

在第二种方法中,actual[0]arrayToCopy参考不同的数组,您实际上是从一个数组中"复制"元素。改变一个,不会改变另一个。

至于您的问题,它在"功能"方面有不同吗?取决于您的含义,但是如果数据仅读取,那么这并不是一件大事。只有在您可以修改数据并且不小心并开始更改不应更改的内容时,这才成为一个问题。

在Java中,作业是由参考(Bilean,Int,float,float,double,short,char,byte,long(。您不复制数组,而只是在另一个变量中引用它。

 actual[0] = arrayToCopy;

如果您尝试做这样的事情:

 actual[0][3] = 5;
 System.out.println(arrayToCopy[3]);

您会发现5。任何一个发生的变化都会发生在其他变化上。

但是您的第二次尝试复制了数组。

如果您想进行表演副本,请考虑使用System.arrayCopy https://docs.oracle.com/javase/7/docs/api/java/java/lang/system.html#arraycopy(Java.lang.object.bignt.bignt.bignt.bimpt, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int, int,%20Java.lang.Object,%20inin,%20inin(

如果您想在不同对象之间共享性能编程,并且您的数组不会共享,则可以使用引用解决方案(您的第一个解决方案(。但是,如果您想处于安全的一面,或者担心不同对象之间的线程和数据共享,请尝试复制。