Java 是什么导致我的2D阵列发生变化?
我有一个叫做“playingField”的2D数组。在进行任何更改之前,我制作了一个tempField二维数组并设置tempField=playingField 经过几次修改(所有修改都有效),我在代码中达到了这一点: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
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;