我尝试移动阵列,但我遇到了问题。
移位数组的代码如下:
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);
答案 0 :(得分:2)
首先,让我澄清一些概念。 obj
是引用类型。引用类型的变量将引用保存到实际对象。执行aRefVariable = anotherRefVariable
时,您没有创建新对象。相反,您说aRefVariable
应该与anotherRefVariable
保持相同的引用。基本上,在执行该行之后,这两个变量指向同一个对象。
问题在于这一行:
data2[i+1] = data2[i];
您说data2[i+1]
应与data2[i]
保持相同的引用。
为了简化这种情况,我们假设i
为0,现在该行变为:
data2[1] = data2[0];
正如我所说,data2
的第二个和第一个元素现在指向相同的对象。 1}}就您所拥有的对象而言,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]) ;
这将创建一个新对象,它基本上是旧对象的副本,并且彼此互斥。