2009-06-05 3 views
0

this質問にお答えしました。 Kathy Van StoneはそうjList、ベクトル、または配列内のsetListDataの方が良い方法はありますか?

jList1.setListData(LinkedHashMap.keySet().toArray()); 

のように配列を追加することで、これに何らかの真実があった場合、私は疑問に思って、この

jList1.setListData(new Vector<String>(LinkedHashMap.keySet())); 

ようにそれを行うによりそうであれば、より良い方法であると言うその背後にある理由ありました。

答えて

3

Vectorクラスで同期が必要ですか?そうでなければ、Vectorクラスを使用したくないです。 (その代わりにArrayListを使用するとJListしか許可されていない場合)最近のJVMバージョンでは、競合していない同期のコストがの方法より低くなりました。それでも、不要な同期を使用する理由はありません。

Kathy Van StoneさんがVectorの余分な同期を参照しているようです。

注意を慎重public JList(Vector<?> listData)のJavaDoc:

作成したモデルは、直接指定されたVectorを参照します。リストを作成した後に ベクターを変更しようとすると、定義されていない動作が発生します。

残念ながら、public JList(Object[] listData)のJavaDocは、同じ警告があります

作成したモデルは、直接指定された配列を参照します。リストを作成した後に 配列を変更しようとすると、未定義の動作が発生します。

Vector vec = new Vector<String>(LinkedHashMap.keySet()); 
jList1.setListData(vec); 
// Other stuff with Vector 
vec.add(....); // Adding some data type that fits in the Vector 

...またはコースの:あなたが誰かが後で同じ方法でVectorが有用であると判断したため、このようなコードを変更することを任意の可能性があるかどうかを決定する必要があり

Arrayコンストラクタのバージョンと同じ変更。

+0

おそらく実際に余分なオブジェクトを作成する余裕がない限り、常に安全な側に置いて新しいVector /オブジェクトをインスタンス化するほうがよいでしょう –

+0

どちらの方法でも、配列やベクトル、それは、繰り返し実行して作成する方が効率的であるかという単なる問題です。直感はアレイだが、実際にはテストは順調だ。 – Yishai

+0

@Yishai:本当に、あなたが本当にタイミングを気にしたら、それをプロファイルしてください。しかし、ベクトルは同期されているので(内部で配列に裏打ちされていますか?)、純粋な配列が遅い場合は驚いています。 – Eddie

1

JListクラスで両方のsetListDataメソッドの実装を見てみると、本当に問題ではないことがわかります。 もう一つのコレクション(Vector)を取り込む必要がないため、最初のものを好むでしょう

関連する問題