我试着换了一个数组,但我有问题。
移位数组的代码如下:
for(int i = (size - 1); i >= 0; i--)
{
data2[i+1] = data2[i];
}
数组init (从另一个数组复制)
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];
例如,如果size = 3,我只想操作和使用data1 -> data3的数据。但是,如果数据的数据发生变化,data1的数据也会发生变化。这是什么原因?
例:
数据2: 6-1 数据21: 6-1 数据22: 4-8 数据23: 9-5
data2[0].setElementTwo(3);
资料2: 6-3 数据21: 6-3 数据22: 4-8 数据23: 9-5
我将第一个数组复制到第二个数组,因为data[]是在从0->size生成的另一个类中生成的,而对于程序的这一部分,我需要1->size+1。
-edit为了清晰-
全伪码:
obj[] data = new obj[size];
obj[] data2 = new obj[size + 1];
for(int i = (size - 1); i >= 0; i--)
{
data2[i+1] = data2[i];
}
for(int i = 1; i <= size; i++)
{
data2[i] = data[i-1];
}
data2[0] = data[0];
// print data2 0->3
// change data2[0] value
// print data2 0->3, values would have changed for data[0] and data[1]
// but I only want to change values for data[0] and not data[1]
发布于 2017-02-04 07:51:23
首先,让我澄清一些概念。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
发布于 2017-02-04 07:28:58
新的data2[]引用的是旧的data[],所以旧的变化将反映在新的。如果你不想那样做
data[index] = new obj(data[i-1]) ;
这将创建一个新对象,它基本上是旧对象的副本,并且相互排斥。
https://stackoverflow.com/questions/42037714
复制相似问题