1

私が尋ねた質問に対するこの回答で。キャシー・ヴァン・ストーンは、そのように配列を追加すると言います

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

このようにするよりも良い方法です

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

これに真実があったかどうか、もしそうならその背後にある理由は何だったのだろうか.

4

2 に答える 2

3

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

キャシー・ヴァン・ストーンが で追加の同期について言及しているようVectorです。

の JavaDoc に注意してくださいpublic JList(Vector<?> listData):

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

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

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

後で同じメソッドで が有用であると誰かが判断しVector、コードを次のように変更する可能性があるかどうかを判断する必要があります。

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

...またはもちろん、配列コンストラクターのバージョンと同じ変更。

于 2009-06-05T01:24:48.707 に答える
1

JList クラスの両方の setListData メソッドの実装を見てください。実際には問題ではないことがわかります。さらに別のコレクション(ベクター)を含める必要がないという理由だけで、最初のものを好むでしょう

于 2009-06-05T01:17:25.227 に答える