2017-02-04 55 views
0

我试过移动一个数组,但我遇到了问题。Java阵列移位引用

代码到阵列偏移如下:

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]; 

例如,如果尺寸= 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

data2[0].setElementTwo(3); 

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

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

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

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

我正在复制第一个数组到第二个数据,因为数据[]是在另一个类中产生的,从0-> size,而我需要1-> size + 1的这部分该程序。

-edit为clarity-

充满伪代码:

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] 
+0

不清楚大部分这些变量都被初始化为与其中代码序列被操纵。还要明确指出你想要达到的目标。 – nullpointer

回答

2

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

问题就在这条线:

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

您是说data2[i+1]应持有同一基准data2[i]。现在

data2[1] = data2[0]; 

正如我说的data2指向相同对象在第二和第一元件:

为了简化的情况下,让我们假设i是0,所以线现在变成。访问data2[0]与您得到的对象完全相同。

大,让我们修改对象的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 
0

新DATA2 []是引用旧数据[],所以在旧的变化将在新的反映。 如果你不希望使用

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

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