- ベストアンサー
VectorとArrayListの違い
お世話になっています。 VectorとArrayListやHashTableとHashMapなど、同期型と非同期型のクラスなどありますよね。 これらは具体的にどのようなときに使い分ければ良いのでしょうか? 私の考えでは、どの場面でもArrayListやHashMapを使っても問題ないと思ってしまいます。 マルチスレッドでスレッドが生成される前に生成されたListオブジェクトを参照した場合には予想と異なる動きをしそうですが、それ以外では全く問題ないように思います。 どの様に使い分ければよいのでしょうか?
- みんなの回答 (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 でもいいですが。
その他の回答 (2)
- Harry_
- ベストアンサー率55% (36/65)
全ての場合で Vector,Hashtable を使用せず、ArrayList と HashMap のを利用するのが、 ある意味正しいと思います。 ArrayList は非同期ですが、そのために、 Collections.synchronizedList(new ArrayList()); というコードで、同期化されたリストを 取得可能な方法が提供されていますので、 Vector の存在は必須ではありません。 パフォーマンスの観点から見ると、一見同期が取られてない ArrayList が高速とも考えられますが、 内部のメソッド呼出がわずかに複雑であるなどの理由? で、Vector の方が高速だという実測結果もあるようです。 それでも Vector を使用しないというのは プログラミングスタイルの問題です。 Vector は、コレクションフレームワークという 一貫性のある優れた設計のフレームワークが Java に追加される前から存在するため、 elementAt など一貫性のない余計なメソッドが含まれています。 こういったメソッドの使用を許すと、Vector を List インターフェースを介して利用することが できなくなります。 コレクションフレームワークを設計した人にとっては、 Vector は邪魔だし、削除できるものならしたかった だろうと思います。
補足
返事遅れまして、すいません。 確かに、コードから言ったらArrayListの方が きれいですね。 しかし…。実は同期、非同期っていう考え方が 良く分かっていません。 どのようなときに同期を取らなければならないのでしょうか。
- mi-si
- ベストアンサー率35% (200/567)
JDK1.1からの流れで、VectorとHashTableを使ってます。JDK1.1とも下位互換を取っているので。 ArrayListやHashMapが同期を取らないと言う点を利用するすれば、同期を取らない分オーバーヘッドが小さくなります。従って、非同期でも困らないアプリケーションに於いてパフォーマンスをあげたい時に利用すると良いのでは無いでしょうか?逆に同期を取る必要が有る場合ロジックが複雑になり扱いにくくなります。その場合は、VectorとHashTableを使うべきでしょう。どちらを使うか迷う場合もVectorとHashTableを使った方が良いでしょうね。
補足
返答遅れまして、すいません。 > どちらを使うか迷う場合もVectorとHashTableを使った方が良いでしょうね。 実はこの使い分けが良く分かっていません。 どのようなときに同期をとらなければいけないのでしょうか?
お礼
返答が遅れたにもかかわらず、それに対する素早い回答ありがとうございます。 回答としては、複数のスレッドで1つのオブジェクトの共有が問題であるってことですよね。 一応、その認識はあったんですが、どうも自信が無くて…。 大変助かりました。 ありがとうございます。