Java数组移位引用

时间:2017-02-04 07:23:23

标签: java arrays pointers

我尝试移动阵列,但我遇到了问题。

移位数组的代码如下:

onPause

Array init(从另一个数组复制)

for(int i = (size - 1); i >= 0; i--)
{
    data2[i+1] = data2[i];
}

例如,如果size = 3,我只想操纵和使用数据[1] - >数据[3]。但是,如果数据[0]的数据发生变化,数据[1]的数据也会发生变化。是什么原因造成的?

例如:

  

数据2 [0]:6 ---- 1 ---- 0 ---- 0

     

数据2 [1]:6 ---- 1 ---- 0 ---- 0

     

数据2 [2]:4 ---- 8 ---- 0 ---- 0

     

数据2 [3]:9 ---- 5 ---- 0 ---- 0

obj[] data = new obj[size];

obj[] data2 = new obj[size + 1];

for(int i = 1; i <= size; i++)
{
    data2[i] = data[i-1];
}

data2[0] = data[0];
  

数据2 [0]:6 ---- 3 ---- 0 ---- 0

     

数据2 [1]:6 ---- 3 ---- 0 ---- 0

     

数据2 [2]:4 ---- 8 ---- 0 ---- 0

     

数据2 [3]:9 ---- 5 ---- 0 ---- 0

我正在将第一个数组复制到第二个数组,因为data []是在另一个类中生成的,它从0->大小生成,而我需要1&gt; size + 1来执行这部分程序。

- 为了清晰起见 -

完整的伪代码:

data2[0].setElementTwo(3);

2 个答案:

答案 0 :(得分:2)

首先,让我澄清一些概念。 obj是引用类型。引用类型的变量将引用保存到实际对象。执行aRefVariable = anotherRefVariable时,您没有创建新对象。相反,您说aRefVariable应该与anotherRefVariable保持相同的引用。基本上,在执行该行之后,这两个变量指向同一个对象。

问题在于这一行:

data2[i+1] = data2[i];

您说data2[i+1]应与data2[i]保持相同的引用。

为了简化这种情况,我们假设i为0,现在该行变为:

data2[1] = data2[0];

正如我所说,data2的第二个和第一个元素现在指向相同的对象。 data2[0]与data2[1]完全相同。

很好,让我们修改data2的第一项:

data2[0].setElementTwo(3);

现在,data2[0]引用的对象已被修改。当您尝试访问data2[1]时,您也会看到修改。为什么?因为data2[0]data2[1]指的是同一件事!

要解决此问题,您需要替换此行:

data2[i+1] = data2[i];

有这样的事情:

data2[i+1] = new obj(...); 
// you should create a new obj that has the same values as data2[i] using its constructor

答案 1 :(得分:0)

新数据2 []引用旧数据[],因此旧数据的变化将反映在新数据中。 如果您不想使用

 data[index] = new obj(data[i-1]) ;

这将创建一个新对象,它基本上是旧对象的副本,并且彼此互斥。