2014-02-17 69 views
0

我有兩個相同的二維數組的字符,但我想這樣做,所以當我改變一個它不會影響其他。我假設這是因爲他們在記憶中共享相同的空間,並想知道如何阻止這一點。如何停止兩個陣列具有相同的內存

private char[][] a; 
private char[][] b; 

a = new char[8][]; 
b = new char[8][]; 

while(file.hasNext()) //reads 8 lines from a file and adds it to text to both arrays 
{ 
    char[] constant = file.nextLine().toCharArray(); 
    a[i] = constant; 
    b[i] = constant; 
    i++; 
} 

然後如果我是運行的代碼

a[0][0] = 't'; 

那麼它也改變B [0] [0]至 'T'

+1

發佈您的代碼。變量不'在Java中共享內存。 – EJP

+0

@EJP _Technically_,它們可能被存儲在變量表的同一個索引中。 (破壞球) –

+0

@SotiriosDelimanolis這將隱含地違反Java語言規範#4.5和Java虛擬機規範#2.5(每個語言中相同的措詞)。 – EJP

回答

1

我的第一個想法是:

char[] orig = // something; 
char[] copy = orig.clone(); 

但要注意: 的clone()只創建一個數組的淺表副本。這意味着對於具有字符的2D陣列,您必須克隆每個子陣列。

有關克隆()的更多信息,請單擊「here」。

你的代碼應該是這個樣子

char[][] original = new char[3][3]; 
char[][] copy = new char[orignal.length][0]; 

for(int i = 0; i < original.length; i++){ 
    copy[i] = original[i].clone(); 
} 
4

數組是對象。當你將他們這樣

int[][] firstArray = getArray(); // Get your array from somewhere 
int[][] secondArray = firstArray; // Assign an array 

你只有一個數組,但你有一個第二變量引用它。本質上,secondArray[i][j]firstArray[i][j]通過兩個不同的名稱在內存中引用相同的對象。

要解決此問題,請複製數組。這樣做的一個簡單的方法是調用原來陣列上的clone()方法,像這樣:

int[][] secondArray = new int[firstArray.length][]; 
for (int i = 0 ; i != secondArray.length ; i++) { 
    secondArray[i] = (int[])firstArray[i].clone(); 
} 

注:clone()創建一個淺表副本。如果您

+2

請注意,克隆()創建一個淺對象的副本。在你的例子中,clone()似乎創建了一個深層副本。 – ROT13

+0

我剛剛發現這不適用於具有多於二維的數組。但是,如果你爲每個嵌套數組循環它的工作原理 –

+1

@icantdojavabuticandovb正確 - 你可以'clone()'只有最後一個維度;你需要所有剩餘的循環。 – dasblinkenlight

0

我有兩個字符相同的二維數組的,但是我想使它這樣,當我修改一個它不影響其他。我假設這是因爲他們在記憶中共享相同的空間,並想知道如何阻止這一點。

數組不共享內存。 Java中也沒有其他變量。

Ergo如果更改爲一個會影響另一個,那麼不會根本就有兩個數組。你只有一個,有兩個引用。通過一個參考更新數組通過另一個參考可見。

因此,解決方案是創建兩個數組,而不僅僅是一個。

相關問題