1

質問: 次のように出力されるのはなぜですか:

ChildB___Parent of ChildB
ChildB___Parent of ChildB

印刷する必要があると思うものの代わりに:

ChildA___Parent of ChildA
ChildB___Parent of ChildB

問題の短い自己完結型の一般化された例:

import java.util.ArrayList;
import java.util.List;

public class StackExchangeQuestion1 {
public static void main(String[] args){
   List<String[]> list = new ArrayList();   
   String[] pair = {"childID","parentID"}; //for readability this gets overwritten       

//adding values to list
   pair[0] = "ChildA";
   pair[1] = "Parent of ChildA";
   list.add(pair);

   pair[0] = "ChildB";
   pair[1] = "Parent of ChildB";
   list.add(pair);

//checking values in list
   for(int i=0;i<list.size();i++){
   pair = list.get(i); //variable reuse for readability
   System.out.println(pair[0]+"___"+pair[1]);
   }
}}//end class and main
4

3 に答える 3

4

リストに同じString[]参照を 2 回追加しています。このため、リスト内の両方の要素が同じオブジェクトを指しています。したがって、配列を上書きすると、実際には同じメモリに書き込んでいました。リストはこのメモリを 2 回参照していたため、2 つの同一の print ステートメントが得られます。

Java はすべての非プリミティブ値を参照によって渡します (つまり、非プリミティブ オブジェクトがメモリに格納されている場所へのポインターを渡します)。

代わりに整数を次のように格納していた場合:

int a = 10;
list.add(a);
a = 20;
list.add(a);

aは整数であり、整数はプリミティブ値であり、プリミティブ値は値渡しであるため、すべて問題ありません これは、メモリ内のポイントaが保持されるのではなく、データがリストにコピーされることを意味します。

ただし、あらゆる種類の文字列と配列はプリミティブではありません。

コードを修正するには、2 つの別々の参照をリストに渡す必要があります。

String[] pair1 = {"ChildA","Parent of ChildA"};
String[] pare2 = {"ChildB", "Parent of ChildB"};
//adding values to list
list.add(pair1);
list.add(pair2);

編集:

冗長性についてのコメントで懸念を表明しました。まず、あなたのコードは冗長ではないと思います。しかし、あなたが本当にそれについて心配しているなら、それを短くする方法があります:

list.add(new String[]{"ChildA","Parent of ChildA"});
list.add(new String[]{"ChildB","Parent of ChildB"});
于 2013-07-16T01:38:01.813 に答える
2

オブジェクトではなく参照ArrayListを格納するためです。参照は常に同じオブジェクトを参照します。その参照をリストに 2 回追加するだけです。pair

于 2013-07-16T01:37:14.773 に答える
0

あなたの文字列オブジェクト配列はここでオーバーライドされています。リストにはオブジェクトの参照が保存されるため、最後の変更のみが文字列に反映されます。想定される出力を取得したい場合は、値を設定する前に毎回新しいオブジェクトを作成してください。

于 2013-07-16T01:58:29.207 に答える