Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是什么导致我的2D阵列发生变化?_Java_Arrays_Variables_Initialization_2d - Fatal编程技术网

Java 是什么导致我的2D阵列发生变化?

Java 是什么导致我的2D阵列发生变化?,java,arrays,variables,initialization,2d,Java,Arrays,Variables,Initialization,2d,我有一个叫做“playingField”的2D数组。在进行任何更改之前,我制作了一个tempField二维数组并设置tempField=playingField 经过几次修改(所有修改都有效),我在代码中达到了这一点: else { //at this point both playingField and tempField are unchanged still boundsNormal = bounds.OutOfBounds(move.MovePlayer(playingFiel

我有一个叫做“playingField”的2D数组。在进行任何更改之前,我制作了一个tempField二维数组并设置tempField=playingField

经过几次修改(所有修改都有效),我在代码中达到了这一点:

else {
//at this point both playingField and tempField are unchanged still
    boundsNormal = bounds.OutOfBounds(move.MovePlayer(playingField,trekker, direction, rowT, colT));
    if(boundsNormal == true){
//for some reason, at this point, tempField gets reassigned to the new playingField (which I'm still not sure why *THAT* changes)
        playingField = tempField;
MovePlayer是一种修改它所使用的2D数组(在本例中为playingField)的方法,给定一个数组,OutOfBounds返回true或false

我可能理解playingField为什么会被更改,但不知道为什么在初始化boundsNormal变量后tempField会发生任何更改

我制作了一个tempField二维数组并设置tempField=playingField

你说的没有道理。您正在生成一个名为
tempField
的数组变量,但如果

tempField = playingField
然后两个变量现在都指向同一个数组。因此,它们都被更改,因为它们是相同的数组

为了避免这种情况,通常可以使用
System.arrayCopy
而不是
=
。但是,对于二维数组,“深度复制”要复杂一些,因为您有一个数组数组

(注意:一般来说,当对象是可变的时,您可能需要“深度复制”或“深度克隆”它们,而不是使用
=
,以避免此问题。数组只是此一般规则的一个示例。)


这行代码不复制数组,而是复制引用。在此赋值之后,
playingField
tempField
表示内存中的同一数组(之前由playingField表示的数组可能正在等待垃圾收集)。因此,如果在此之后更改由
playingField
表示的数组中的任何内容,更改也将在
tempField
中可见,因为它现在基本上是相同的数组(不是复制的数组,只是具有两个名称的相同数组)。

注意
if(boundsNormal==true)
可以简化为
if(boundsNormal)
您如何定义
tempField
?看起来您是在创建对playingField的引用,而不是创建另一个2D数组。@Akshat Singhal-听起来您与Robin Green的观点一致;我不知道我只是在做一个引用,我确信用另一个数组初始化一个数组和复制是一样的。谢谢你的输入。@ZouZou-谢谢,我会先更改它,谢谢你的回复。第二,如果我通过循环playingField中的每个元素创建tempField,并将temp中的每个单元格指定为与相应playingField单元格相同的单元格,该怎么办;这是可行的,还是仅仅创建一个引用?这取决于。如果单元格包含基元类型,则不创建引用,否则将创建引用。但对不可变类型(如字符串)的引用是安全的。
playingField = tempField;