2011-07-22 7 views
1

私は検索しましたが、良い答えが見つかりませんでした。コレクション内のオブジェクトは静的ではありませんか?

私はインスタンスオブジェクト(例オブジェクトX)を作成しましたが、そのArrayListをコンストラクタオブジェクトXのパラメータとして使用しましたが、オブジェクトXのインスタンスを作成するたびに、ArrayListには古い値は、新しいArrayListを作成しませんでした。

私はarraylistのようなaddメソッドを使う必要があります。

public NodeRandom(int id){ 
     this.id = id; 
} 

次に、データパケットがNodeRandomのIDを追加します、データパケットは、オブジェクトNodeRandomを満たす

public DataPacket(int hop, int TTL, ArrayList onetimevisit){ 
     this.hop = hop; 
     this.TTL = TTL; 
     this.visited = onetimevisit; 
} 

他のループ処理で:これは、コードです。

コレクション内のオブジェクトは静的ではありませんか?

+1

コードを表示してください。 –

+2

あなたの実際のコードを表示して、あなたに何をしたいか教えてください –

+1

この状況では、いくつかのコードが本当に役に立ちます。 –

答えて

1

短い答え:

変更

this.visited = onetimevisit; 

this.visited = new ArrayList (onetimevisit); 

長い答え:

ArrayListsは必ずしもstaticである必要はありません。私は間違ってあなたがそれを渡した方法でそれを渡すときArrayListは、ArrayListの唯一のコピーがあるという事実から静的に何かが設定されている必要があります推測していると思います。 Javaでオブジェクトを渡すと(たとえば、ArrayList)、参照がオブジェクトに渡されていることを理解してください。参照は、ポインタ演算などが許されないという区別のあるCスタイルのポインタに似ています。メソッドを呼び出してオブジェクトを渡すと、呼び出されたメソッドはオブジェクトのコピーではなく参照のコピーを取得します。同様に、=演算子を使用してあるオブジェクトを別のオブジェクトに割り当てる場合、参照を互いに等しい値に割り当てるだけであり、依然としてオブジェクトのコピーは1つのみです。あなたのコードでは、this.visitedonetimevisitは、メモリ内の同じオブジェクトを指すようになる参照です。

一方、ArrayListにはコピーコンストラクタに似たものがあります。上記のサンプルコードで呼び出されたこのコンストラクタは、指定されたArrayListの浅いコピーを作成します。これはあなたが望むようです。 ArrayListは、それに追加されたオブジェクト(それへの参照を格納する)をコピーしないので、実際に必要なのはオブジェクトのコピーも作成することです。 ArrayListに挿入する前に、コピーコンストラクタを呼び出す(コピーコンストラクタを提供することによってコピーを許可する場合)。

+0

ありがとうございます – afni

+1

@afni:リストのオブジェクトはコピー後も共有されています!ユーザーのリストがあり、新しいArrayList(oldUsers)を使用してコピーを渡してユーザーの名前を変更すると、すべてのリストに更新された名前が表示されます。 – extraneon

+0

@ extraneon-はい。私はそれを試みましたが、私はそのコンセプトと私の間違いを知っています。 – afni

1

new ArrayList()を作成する必要がある場合は、自動的には行いません。

関連する問題