VectorまたはArrayList-どちらが良いですか?

Q: VectorまたはArrayList-どちらが優れているのですか?その理由は何ですか?

A:時々Vectorより良いです。時にはArrayListより良いです。どちらも使いたくない場合があります。答えはあなたがしていることに依存するので、あなたが簡単な答えを探していなかったと思います。考慮すべき4つの要素があります。

  • API
  • 同期
  • データの増加
  • 使用パターン

それぞれを順番に見ていきましょう。

API

ではJava言語プログラミング(アディソン・ウェズリー、2000年6月)ケン・アーノルド、ジェームズ・ゴスリング氏、デビッドホームズは説明するVectorまでアナログとしてArrayList。したがって、APIの観点からは、2つのクラスは非常に似ています。ただし、2つのクラスの間にはまだいくつかの大きな違いがあります。

同期

Vectors同期されます。Vectorの内容に触れるメソッドはすべてスレッドセーフです。ArrayList一方、は同期されていないため、スレッドセーフではありません。この違いを念頭に置いて、同期を使用するとパフォーマンスが低下します。したがって、スレッドセーフなコレクションが必要ない場合は、を使用してくださいArrayList。なぜ不必要に同期の代償を払うのですか?

データの増加

内部的には、ArrayListとの両方が。Vectorを使用してコンテンツを保持しArrayます。プログラムでどちらかを使用するときは、この事実を覚えておく必要があります。要素をArrayListまたはに挿入するときVectorに、オブジェクトのスペースが不足した場合、オブジェクトはその内部配列を拡張する必要があります。Vectorながら、その配列のサイズを倍増デフォルトArrayList配列サイズを50%増やします。これらのクラスの使用方法によっては、新しい要素を追加するときにパフォーマンスに大きな打撃を与える可能性があります。オブジェクトの初期容量を、プログラムが必要とする最大容量に設定するのが常に最善です。容量を慎重に設定することで、後で内部アレイのサイズを変更するために必要なペナルティを支払うことを回避できます。保持するデータの量がわからないが、データの増加率はわかっているVector場合は、増分値を設定できるため、わずかな利点があります。

使用パターン

ArrayListVectorはどちらも、コンテナ内の特定の位置から要素を取得したり、コンテナの端から要素を追加および削除したりするのに適しています。これらの操作はすべて、一定の時間で実行できます--O(1)。ただし、他の位置から要素を追加および削除すると、コストが高くなります。正確には線形です。O(ni)。ここで、nは要素の数、iは追加または削除された要素のインデックスです。これらの操作は、インデックスi以上のすべての要素を1つの要素だけシフトする必要があるため、よりコストがかかります。では、これはどういう意味ですか?

つまり、要素にインデックスを付けたり、配列の最後で要素を追加および削除しVectorたりする場合は、aまたはArrayList。を使用します。コンテンツに対して他のことをしたい場合は、別のコンテナクラスを見つけてください。たとえば、はLinkedList一定時間内の任意の位置で要素を追加または削除できます--O (1)。ただし、要素のインデックス作成は少し遅くなります-O(i)ここで、iは要素のインデックスです。ArrayListイテレータを作成する代わりにインデックスを使用できるため、のトラバースも簡単です。またLinkedList、挿入された要素ごとに内部オブジェクトを作成します。したがって、作成される余分なゴミに注意する必要があります。

最後に、Practical Javaの「PRAXIS41」(Addison-Wesley、2000年2月)で、Peter Haggarは、Vectorまたはの代わりに、ArrayList特にパフォーマンスが重要なコードの場合は、単純な古い配列を使用することを提案しています。配列を使用することで、同期、余分なメソッド呼び出し、および最適ではないサイズ変更を回避できます。追加の開発時間のコストを支払うだけです。

このトピックの詳細

  • Javaプログラミング言語KenArnold、James Gosling、およびDavid Holmes(Addison-Wesley、2000年6月、ISBN0201704331)

    //www.amazon.com/exec/obidos/ASIN/0201704331/javaworld/

  • 実用的なJavaPeter Haggar(Addison-Wesley、2000年2月; ISBN0201616467)

    //www.amazon.com/exec/obidos/ASIN/0201616467/javaworld/

  • もっと欲しい?完全なQ&Aカタログについては、Java Q&Aインデックスを参照してください。

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • ビジネスの最高の頭脳からの100を超える洞察に満ちたJavaのヒントについては、JavaWorldJavaヒントインデックスにアクセスしてください。

    //www.javaworld.com/javatips/jw-javatips.index.html

  • 以下のためにサインアップJavaWorld今週の新機能のための無料の週刊メールマガジンJavaWorld

    //idg.net/jw-subscribe

このストーリー、「VectorまたはArrayList-どちらが良いですか?」もともとJavaWorldによって公開されました。