0

私はグローバル変数に格納されたオブジェクトを持っています:

static ArrayList<Object> list = new ArrayList<Object>();

構造自体の値を実際に変更せずに、後で調べて保存したいと思います。だから私はこれに似たようなことをしています:

public void someMethod()
{
     ArrayList<Object> tempList = new ArrayList<Object>();
     tempList = list;
     list.remove(0);
}

これは、変数を「静的」として初期化することに関係があるのではないかと考えています。私は通常それをしませんが、Eclipse はそうしなければならないと私に言ったので、私はただ変更を起こさせました。

私の理解では、元のリストを一時リストに保存しており、一時リストに対して行うことは元のリストとは無関係です。しかし、この上記のリストから何かを削除すると、元のリストもそれを削除しているようです.

これが時々発生する可能性があることを学んだことを覚えていますが、以前はその問題が発生しなかったと思います。

これが繰り返しの質問である場合は申し訳ありませんが、私の言い方では同様の質問が表示されませんでした。

ありがとう!

4

2 に答える 2

4

私の理解では、元のリストを一時リストに保存しており、一時リストに対して行うことは元のリストとは無関係です。

これはそうではありません。あなたが何かをするとき

a = b;

両方とも a同じオブジェクトを参照しますb。の変異は に現れ、その逆も現れます (問題のオブジェクトは 1 つしかないため)。この場合、次のコピー コンストラクタを使用することをお勧めします。abArrayList

ArrayList<Object> tempList = new ArrayList<Object>(list);

ここでは、新しい独立したオブジェクトを明示的に作成し、それを に割り当てていることtempListに注意してください。

これにより、浅いコピーと呼ばれるものが作成されることに注意してください。リスト自体によって参照されるオブジェクトはコピーされませんが、代わりに、元のリストと同じオブジェクトへの参照を含む 新しいリストが作成されます。

于 2013-09-17T23:38:27.777 に答える
0

someMethodあなたの最後にtempList、GC の暗い空間に消えます。残しておきたい場合は、そのまま類似のフィールドに変える必要がありますlist

また、に割り当てるlisttempList、同じオブジェクトへの 2 つの参照が作成されます。

于 2013-09-17T23:38:37.700 に答える