2016-09-24 18 views
0

2つの同一の配列をとり、最初の配列の最初の値を2番目の配列の最後の値に設定するという非常に簡単な作業を実行しようとしています。配列予期しない動作

以下のコードは、numberArrayduplicateArrayでそうしようとしています。しかし、コードの大部分は、なぜ私が奇妙な結果を得ているのかを理解しようとしています。

System.out.print("Normal array 1: "); 
for (int l = 0 ; l < numberArray.length ; l++){ 
    System.out.print(numberArray[l]); 
} 

System.out.print("Duplicate array 1: "); 
for (int l = 0 ; l < duplicateArray.length ; l++){ 
    System.out.print(duplicateArray[l]); 
} 
System.out.println(); 

numberArray[0] = duplicateArray[duplicateArray.length - 1]; 

System.out.print("Duplicate array 2: "); 
for (int l = 0 ; l < duplicateArray.length ; l++){ 
    System.out.print(duplicateArray[l]); 
} 
System.out.println(); 

System.out.print("Normal array 2: "); 
for (int l = 0 ; l < numberArray.length ; l++){ 
    System.out.print(numberArray[l]); 
} 

この出力:

Normal array 1: 123 
Duplicate array 1: 123 
Duplicate array 2: 323 
Normal array 2: 323 

私には意味をなさない何でも、私はおそらく別に値1のオブジェクトを設定していますが、両方が変化しているということです。

ジャワの私の理解では、これは次のとおりです。

array[x] = array2[y]; 
//value at index x of "array" now equals value at index y of "array 2" 
//however, array2 should not be changed at all since it is just referenced in the above line of code, not mutated 

は、私は本当に簡単な何かが足りないのですか?私はこれを理解しようとしている私の頭脳をラッキングしてきた。どんな助けでも大歓迎です。

EDIT:

私は私の2つの配列の宣言を提供するように求めてきたので、ここで彼らは、次のとおりです。

int[] numberArray = {1, 2, 3}; 
int[] duplicateArray = numberArray; 

これは、右の違いを作るべきではないのですか?ある配列を別の配列に設定すると、それらをリンクしてはいけません。

+1

この配列の宣言を教えていただけますか?私は彼らが同じオブジェクトを参照していると思います –

+0

両方の配列がメモリ内の同じ配列を指しています –

+1

これは**エイリアシング**と呼ばれ、2つの配列が同じ参照を指しているときに発生します。 – QBrute

答えて

3

iは、コメントとして、あなたが名前duplicateArraynumberArrayあなたは両方で指されるメモリ内の配列を変更する意味のいずれかで任意の値を変更した場合

int[] numberArray = {1, 2, 3}; 
int[] duplicateArray = numberArray; // duplicateArray is just a another name for numberArray 

ので、メモリ内の同じ配列を指し、あなたの両方のアレイ。

したがって、にの要素を追加してduplicateArrayに新しい配列を作成する必要があります。この

int[] numberArray = {1, 2, 3}; 
int[] duplicateArray = new int[numberArray.length]; 
System.arraycopy(numberArray , 0, duplicateArray , 0, numberArray .length); 

表示等

ビジュアルビューの画像

visual representation of answer

+0

ありがとう、魅力的なように働いた。あなたはもっと知っている。 –

+0

@Benjamin Lowry letmeが何かを追加してくれてありがとうございます。あなたの歓迎をお待ちしています。Benjamin Lowry –

+0

配列の正確なコピーが必要な場合は、手動で要素をコピーする代わりに 'array.clone()'を使用してください。 – Clashsoft

0

前の答えは、アレイの整数要素は不変であるが、アレイ自体は、明確にするために、正しいですない。基本的に、2つの参照に1つの配列があります。 'duplicate'は重複したオブジェクトではなく、重複した参照です。

関連する問題