2017-02-04 54 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]) ; 

這將創建一個新的對象,這將是基本的舊對象的副本,並彼此相互排斥。