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

时间:2014-01-04 20:00:44

标签: java arrays variables initialization 2d

我有一个名为“playingField”的2D数组。在进行任何更改之前,我创建一个tempField 2D数组并设置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。

我可以理解为什么playField被改变了,但是在初始化boundsNormal变量之后我不知道为什么tempField应该经历任何改变。

2 个答案:

答案 0 :(得分:2)

  

我制作一个tempField 2D数组并设置tempField = playingField。

你说的话没有意义。您正在创建一个名为tempField的数组变量,但如果您这样做

tempField = playingField

然后两个变量现在都指向同一个数组。所以它们都被改变了,因为它们是相同的阵列。

为避免这种情况,您通常可以使用System.arrayCopy代替=。但是,对于二维数组来说,“深度复制”它会有点复杂,因为你有一个数组数组。

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

答案 1 :(得分:0)

playingField = tempField;

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