
お世話になっています。
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Googleログインボタンのデザイ...
-
プログラミングの問題です。大...
-
JDONWROADER2のエラー修復
-
スプレッドシートからリマイン...
-
googleスプレッドシートのスク...
-
googleスプレッドシートのGASに...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
jdbcでinsert,delete,createをe...
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
-
ショートカットキーについて
-
list の空は [] ってあわらすのに
-
あんまりお料理しないのに台所...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
String.containsの反対機能はあ...
-
Java初級 引数に適用できません
-
レコード件数の表示
-
StringBufferからStringへキャ...
-
readLine()ではじめから読み直...
-
C# 点の描き方をおしえてくだ...
-
C# の ByVal と ByRef について
-
Google Apps Script で getRang...
-
abstract と static を一緒に付...
-
return new使用時
-
説明文書でのメソッド・変数の...
-
CSVから読み込んだデータの保持...
-
Javaの問題なんですが、練習14-...
-
スーパークラスからサブクラス...
-
YYYYMMDD書式の日付に対する適...
-
java ジェネリックスに関して
-
シェルスクリプトからのJavaメ...
-
リストボックスの並べ替え (VB...
-
Java の配列の中身は volatile ...
-
なぜprotected overrideなのか
おすすめ情報