お世話になっています。
VectorとArrayListやHashTableとHashMapなど、同期型と非同期型のクラスなどありますよね。
これらは具体的にどのようなときに使い分ければ良いのでしょうか?
私の考えでは、どの場面でもArrayListやHashMapを使っても問題ないと思ってしまいます。
マルチスレッドでスレッドが生成される前に生成されたListオブジェクトを参照した場合には予想と異なる動きをしそうですが、それ以外では全く問題ないように思います。
どの様に使い分ければよいのでしょうか?
No.3ベストアンサー
- 回答日時:
同期を取るべき時というのは、複数スレッドが
同時にそのListにアクセスする可能性があるときです。
下のコードは本来 ArrayList を使うべきではありません。
実行すると、リスト内でインデックスなどの整合性
が破壊され add メソッドが例外をスローします。
// 製品クラス
static class Product() {
}
public static void main(String[] args) {
// 製品を保管する倉庫
final List wareHouse = new ArrayList();
for (int i=0; i<10; i++) {
// 製品を作って倉庫に保管するスレッド
new Thread() {
public void run() {
while (true) {
wareHouse.add(new Product());
}
}
}.start();
}
}
new ArrayList()
↓
Collections.synchronizedList(new ArrayList())
と変更すればエラーはでなくなります。
Vector でもいいですが。
返答が遅れたにもかかわらず、それに対する素早い回答ありがとうございます。
回答としては、複数のスレッドで1つのオブジェクトの共有が問題であるってことですよね。
一応、その認識はあったんですが、どうも自信が無くて…。
大変助かりました。
ありがとうございます。
No.2
- 回答日時:
全ての場合で Vector,Hashtable を使用せず、ArrayList と HashMap のを利用するのが、
ある意味正しいと思います。
ArrayList は非同期ですが、そのために、
Collections.synchronizedList(new ArrayList());
というコードで、同期化されたリストを
取得可能な方法が提供されていますので、
Vector の存在は必須ではありません。
パフォーマンスの観点から見ると、一見同期が取られてない ArrayList が高速とも考えられますが、
内部のメソッド呼出がわずかに複雑であるなどの理由?
で、Vector の方が高速だという実測結果もあるようです。
それでも Vector を使用しないというのは
プログラミングスタイルの問題です。
Vector は、コレクションフレームワークという
一貫性のある優れた設計のフレームワークが
Java に追加される前から存在するため、
elementAt など一貫性のない余計なメソッドが含まれています。
こういったメソッドの使用を許すと、Vector を
List インターフェースを介して利用することが
できなくなります。
コレクションフレームワークを設計した人にとっては、
Vector は邪魔だし、削除できるものならしたかった
だろうと思います。
この回答への補足
返事遅れまして、すいません。
確かに、コードから言ったらArrayListの方が
きれいですね。
しかし…。実は同期、非同期っていう考え方が
良く分かっていません。
どのようなときに同期を取らなければならないのでしょうか。
No.1
- 回答日時:
JDK1.1からの流れで、VectorとHashTableを使ってます。
JDK1.1とも下位互換を取っているので。ArrayListやHashMapが同期を取らないと言う点を利用するすれば、同期を取らない分オーバーヘッドが小さくなります。従って、非同期でも困らないアプリケーションに於いてパフォーマンスをあげたい時に利用すると良いのでは無いでしょうか?逆に同期を取る必要が有る場合ロジックが複雑になり扱いにくくなります。その場合は、VectorとHashTableを使うべきでしょう。どちらを使うか迷う場合もVectorとHashTableを使った方が良いでしょうね。
この回答への補足
返答遅れまして、すいません。
> どちらを使うか迷う場合もVectorとHashTableを使った方が良いでしょうね。
実はこの使い分けが良く分かっていません。
どのようなときに同期をとらなければいけないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでArrayListを使う為の「mscorlib.tlb」の参照設定について 3 2022/03/23 19:45
- 工学 音声合成を追加 3 2023/01/30 11:52
- 大学・短大 大学生です。自己剽窃について質問です。 同じ先生の授業を前期と後期にわたって受講しているのですが、前 1 2023/01/31 22:56
- 日本語 どうして中国語では日本語のようにたくさんの同音異義語が有ると都合が悪いのですか? 11 2022/12/23 00:22
- iPhone(アイフォーン) iPhone初期化について質問です。 親から使用時間や勝手にアプリをインストールできないように規制が 2 2022/08/21 11:52
- X(旧Twitter) 楽天モバイルなどで作った電話番号をTwitter認証用に登録する場合について 1 2023/02/04 21:42
- ブルーレイ・プレーヤー・レコーダー BD-REについて教えてください。 3 2022/11/10 23:28
- 日本語 充分と十分の使い分け 7 2022/09/04 09:43
- 数学 『数学的帰納法のトリセツ』 4 2022/06/06 07:34
- 式場探し・ウェディングドレス・結婚準備 新生活に向けての費用 4 2023/02/03 11:42
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下記のリストならno002が含まれ...
-
レコード件数の表示
-
String.containsの反対機能はあ...
-
readLine()ではじめから読み直...
-
Android 別javaファイルのメソ...
-
Java初級 引数に適用できません
-
abstract と static を一緒に付...
-
クラスを作るとメソッドの数が...
-
C# でメソッドに送られてきたOb...
-
C# の ByVal と ByRef について
-
なぜprotected overrideなのか
-
メソッド宣言の戻り値の型にク...
-
呼び元のファイル名、行数を取...
-
StringBufferからStringへキャ...
-
AWTでウィンドウを閉じる仕組み
-
VB.netでフォームを継承して新...
-
__interfaceに定義するメソッド...
-
C# 点の描き方をおしえてくだ...
-
Java初心者です。例外のキャッ...
-
JAVAコンパイルができない。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
public static void main (Stri...
-
abstract と static を一緒に付...
-
Google Apps Script で getRang...
-
StringBufferからStringへキャ...
-
メソッド宣言の戻り値の型にク...
-
javaに"search"という関数 or ...
-
C# 点の描き方をおしえてくだ...
-
Java初心者です、エラーの意味...
-
なぜprotected overrideなのか
-
親の親のメソッドを呼ぶには?
-
C# でメソッドに送られてきたOb...
-
Javaの関数名が長い?
-
別クラスのmainメソッドの実行
-
[クラス名].[メソッド名].[メソ...
-
コマンドライン引数のチェック
-
contextってなんですか?
-
説明文書でのメソッド・変数の...
おすすめ情報