2

いくつかのオブジェクトを保持するベクターがあります。私のコードは、特定の条件に応じて、ループを使用してオブジェクトをベクターに追加します。私の質問は、オブジェクトをベクターに追加するときに、元のオブジェクト参照がベクターに追加されるのか、それともベクターがオブジェクトの新しいインスタンスを作成してそれを追加するのかということです。

たとえば、次のコードでは次のようになります。

private Vector numbersToCalculate;
StringBuffer temp = new StringBuffer();

while(currentBuffer.length() > i) {
    //Some other code
    numbersToCalculate.add(temp);
    temp.setLength(0); //resets the temp StringBuffer
}

私がやっていることは、numbersToCalculateVectorに「temp」StringBufferを追加することです。ループ内に新しいStringBufferを作成して追加する必要がありますか、それともこのコードは機能しますか?助けてくれてありがとう!

エリック

4

6 に答える 6

5

毎回新しいStringBufferを作成する必要があります。ベクター内の各アイテムアイテムは、同じStringBufferオブジェクトへの単なるポインタであるため、ループを通過するたびに、stringbufferの単一のインスタンスをリセットし、同じ参照をベクターに追加します。

temp.setLength(0);と置き換えるだけですtemp = new StringBuffer();

于 2010-03-07T15:20:27.127 に答える
2

Vector、指定した参照を保存します。オブジェクトの独自のコピーは作成されません。したがって、Vector引き続き使用しているバッファとは別のバッファが必要な場合は、古いバッファの長さをゼロに設定するのではなく、新しいバッファを作成してバッファを個別に作成する必要があります。

トピック外の補足:Vectorかなり時代遅れです。おそらく、(または、それをサポートする配列が必要ない場合は、をArrayList実装している他のクラスの1つ)を使用したほうがよいでしょう。List

于 2010-03-07T15:17:36.963 に答える
2

毎回同じオブジェクトを使用します。temp = new StringBuffer();ループの最後にを追加する必要があります。(ループの結果は、同じ単一の空のStringBufferへのポインターのベクトルになります。)

于 2010-03-07T15:17:45.870 に答える
2

ベクターに独立したオブジェクトを追加する必要がある場合は、毎回新しいオブジェクトを作成してください。

ベクトルへの参照を追加しています。オブジェクトの状態が変化すると、そのオブジェクトへのすべての参照に変化が見られます。

于 2010-03-07T15:18:09.613 に答える
1

Javaには、ユーザー定義型のコピーコンストラクターまたは演算子のオーバーロードの形式化された概念がないため、要素をコレクションに挿入しても、オブジェクトのコピーは作成されません。また、作成できません。つまり、汎用コレクションは、含まれているオブジェクトをコピーする方法を知ることができません。

Javaの代入演算子は、コンテンツではなく、常にユーザー定義型のポインターをコピーします。

于 2010-03-07T15:20:05.600 に答える
1

ここでの答えのほとんどが言うように、Vectorストアはタイプのオブジェクトへの参照を格納しますObjectObject基になるものを毎回変更するとVector、1つのオブジェクトへの参照が多数含まれることになり、最後に指定した値が含まれるようになります。

変数の名前に基づいて、実際にはベクターに数値を格納したいと思っていると思います。

理想的な世界では、タイプintのオブジェクトをベクターに追加するだけです。残念ながら、Javaではanintは「プリミティブ型」であり、型のVectorオブジェクトしか格納できませんObject。これは、オブジェクトIntegerではなく、オブジェクトのみをベクターに配置できることを意味しますint

したがって、コードは次のようになります。

// Put a number at index 0
Integer inputNumber = new Integer(7);
numbersToCalculate.add(0, inputNumber);

// Some time later read out the value at index 0
Object objFromVector = numbersToCalculate.elementAt(0);

// Cast the Object to an Integer
Integer numberToProcess = (Integer)objFromVector;

このコードは、オブジェクトではないものが含まれているIllegalCastException場合にをスローします。あなたがそれについて心配しているなら、あなたはそれを声明に含めることができます。VectorIntegertry catch

あなたの例では、おそらくベクター内のすべての数値をループするだけです。また、Vectorに含めることができるオブジェクト(「ジェネリック」と呼ばれ、Cテンプレートに似ています)についてより規範的にすることもできます。これがどのように見えるかです:

Vector<Integer> myVector = new Vector<Integer>();

// Add stuff to the Vector

for (Integer number : myVector)
{
    // Do stuff with the number
}

およびGenericsコンストラクトはforeachJavaSDK1.5でのみ追加されたため、以前のJavaSDKで実行する場合は使用できません。

于 2010-03-09T01:59:41.590 に答える