-1

私のコードがそのように動作する理由を理解するのに苦労しています。私がしているのは、カスタム クラスの ArrayList を作成することです。クラス オブジェクトにデータを入力し、それを ArrayList に追加します。次に、クラス オブジェクトを再利用し、新しい値を入力して ArrayList に追加しますが、最初のオブジェクトが 2 番目のオブジェクトによって上書きされることを除いて?? これを引き起こす可能性のある何らかの内部ポインターがあるか、または配列リストがまだコミットされていませんか?

ここで ArrayList を宣言します

private ArrayList<LiftData> arrylst_LiftData = new ArrayList<LiftData>();

次に、カスタム データ オブジェクトを作成します (いくつかのプロパティを持つクラスのみ)。

LiftData obj_LData = new LiftData();

表示されていない一部のコードが有効なデータを入力し、それを ArrayList に追加します

arrylst_LiftData.add(obj_LData);

この時点で、コードは obj_LData に新しい値を設定するループを通過し、arraylist に追加されますが、最初の値はなくなりましたか???

ArrayList の下に表示されている 2 行目を追加すると、すべてが機能しますか???

arrylst_LiftData.add(obj_LData);
obj_LData = new LiftData();

誰かが私に何が起こっているのか教えてもらえますか?

4

3 に答える 3

3

オブジェクトへの参照を ArrayList に追加するだけです。後でそのオブジェクトを変更するため、もちろん配列リスト内のオブジェクトが変更されます (同じオブジェクトです)。

obj_LData = new LiftData(); を使用 ArrayList のオブジェクトとは異なる新しいオブジェクトを作成しているため、機能します。

LiftData obj_LData = new LiftData();
LiftData obj_LData2 = obj_LData;

ここで、obj_LData と obj_LData2 は同じオブジェクトを指しています。それらのいずれかのプロパティを変更すると、もう一方も変更されます。

于 2012-05-16T17:04:59.200 に答える
3

ArrayList、すべての Java コレクション (Java のすべての変数) と同様に、オブジェクト自体ではなく、オブジェクトへの参照を含みます。単一のオブジェクトしか作成したことがなく、それへの複数の参照でLiftData埋めているようです。ArrayListデータを変更するたびに、 内のすべてArrayListのオブジェクトが変更されます。それらはすべて同じオブジェクトであるためです。

これは、C++ で本質的に同じ構文を使用した場合に得られるものとは対照的です。に挿入するvectorとオブジェクトのコピーが作成され、実際にオブジェクトを変更して再度追加し、 に 2 つの異なるオブジェクトを取得することができますvector。しかし、Java はそのようには機能しません。オブジェクト型のすべての変数は本質的にポインターです。

リストを作成するループでは、LiftData毎回新しいオブジェクトを作成する必要があります。

于 2012-05-16T17:05:26.070 に答える
1

何が起こっていると思いますか: カスタムオブジェクトを「新しく」しないため、(ArrayList の 2 番目の要素に対して) 変更する変数は、実際には配列リストの最初の要素です。メモリ内の同じ場所 (参照による)。

それを「新規」にすると、メモリ内に新しいスペースが作成され、新しいポインタが与えられます。したがって、追加した最初の要素は、2 番目の要素で編集した場所とは別の場所を指しています。

変数を再利用することは問題ありませんが、それ以外の場合はポインターが同じになるため、変更および追加する前に新しいものにする必要があります。

LiftData toAdd;
ArrayList<LiftData> list = new ArrayList<LiftData>();
for (int i=0;i<5;i++) {
   //Without this line here, the pointers to all the elements of the array list will the same.
   //This means that they will have the same values too
   toAdd = new LiftData();
   //init lift data values
   list.add(toAdd);
}
于 2012-05-16T17:07:59.083 に答える