Java ArrayList vs Vector

概要

このチュートリアルでは、ArrayListクラスとVectorクラスの違いに焦点を当てます。 これらはどちらもJava Collections Frameworkに属し、javaを実装しています。ユーティルリストインターフェイス。

ただし、これらのクラスの実装には大きな違いがあります。

何が違うの?

クイックスタートとして、ArrayListとVectorの主な違いを紹介しましょう。 次に、いくつかの点についてより詳細に説明します:

  • 同期–これら2つの間の最初の大きな違い。 Vectorは同期されており、ArrayListは同期されていません。
  • サイズの増加–2つのもう一つの違いは、容量に達したときにサイズを変更する方法です。 ベクトルはそのサイズを2倍にします。 これとは対照的に、ArrayListはその長さ
  • 反復の半分だけ増加します。VectorはIteratorとEnumerationを使用して要素をトラバースできます。 一方、ArrayListはIteratorのみを使用できます。
  • パフォーマンス–主に同期のために、ArrayList
  • frameworkと比較してベクトル操作が遅くなります–また、ArrayListはCollectionsフレームワークの一部であり、JDK1.2で導入されました。 一方、Vectorは以前のバージョンのJavaにはレガシークラスとして存在しています。すでにArrayListに関する拡張ガイドがあるため、ここではそのAPIと機能については説明しません。 一方、我々はベクトルについていくつかのコアの詳細を紹介します。

    簡単に言えば、ベクトルはサイズ変更可能な配列です。 要素を追加または削除すると、成長および縮小することができます。

    典型的な方法でベクトルを作成することができます:

    Vector<String> vector = new Vector<>();

    既定のコンストラクターは、初期容量が10の空のベクトルを作成します。

    いくつかの値を追加しましょう:

    vector.add("baeldung");vector.add("Vector");vector.add("example");

    最後に、Iteratorインターフェイスを使用して値を反復処理してみましょう:

    Iterator<String> iterator = vector.iterator();while (iterator.hasNext()) { String element = iterator.next(); // ...}

    または、Enumerationを使用してベクトルをトラバースできます:

    Enumeration e = vector.elements();while(e.hasMoreElements()) { String element = e.nextElement(); // ... }

    今、のは、より深く彼らのユニークな機能のいくつかを探検してみましょう。

    並行性

    ArrayListとVectorは並行性戦略が異なることはすでに述べましたが、詳しく見てみましょう。 Vectorのメソッドシグネチャに飛び込むと、それぞれにsynchronizedキーワードがあることがわかります:

    public synchronized E get(int index)

    簡単に言えば、これは一度に1つのスレッドだけが特定のベクトルにアクセスできることを意味します。

    ただし、実際には、この操作レベルの同期は、複合操作のための独自の同期とオーバーレイする必要があります。これとは対照的に、ArrayListは別のアプローチを取ります。 そのメソッドは同期されず、その懸念は並行性に専念するクラスに分離されます。たとえば、CopyOnWriteArrayListまたはCollectionsを使用できます。vectorと同様の効果を得るためのsynchronizedList:

    vector.get(1); // synchronizedCollections.synchronizedList(arrayList).get(1); // also synchronized

    パフォーマンス

    すでに上で説明したように、ベクトルは同期され、パフォーマンスに直接影響します。

    Vector操作とArrayList操作のパフォーマンスの違いを確認するために、簡単なJMHベンチマークテストを記述しましょう。

    過去には、ArrayListの操作の時間の複雑さを見てきましたので、Vectorのテストケースを追加しましょう。

    まず、get()メソッドをテストしましょう:

    @Benchmarkpublic Employee testGet(ArrayListBenchmark.MyState state) { return state.employeeList.get(state.employeeIndex);}@Benchmarkpublic Employee testVectorGet(ArrayListBenchmark.MyState state) { return state.employeeVector.get(state.employeeIndex);}

    3つのスレッドと10回のウォームアップ反復を使用するようにJMHを構成します。

    そして、ナノ秒レベルでの操作あたりの平均時間について報告しましょう:

    Benchmark Mode Cnt Score Error UnitsArrayListBenchmark.testGet avgt 20 9.786 ± 1.358 ns/opArrayListBenchmark.testVectorGet avgt 20 37.074 ± 3.469 ns/op

    ArrayList#getはVector#getよりも約3倍高速に動作することがわかります。

    次に、contains()操作の結果を比較しましょう:

    @Benchmarkpublic boolean testContains(ArrayListBenchmark.MyState state) { return state.employeeList.contains(state.employee);}@Benchmarkpublic boolean testContainsVector(ArrayListBenchmark.MyState state) { return state.employeeVector.contains(state.employee);}

    結果をプリントアウトして:ご覧のとおり、contains()操作の場合、Vectorのパフォーマンス時間はArrayListよりもはるかに長くなります。

    概要

    この記事では、JavaのVectorクラスとArrayListクラスの違いを見てきました。 さらに、我々はまた、より詳細にベクトルの特徴を提示しました。

    いつものように、この記事の完全なコードはGitHubで入手できます。

    Learn Springコースを通じて、Spring5とSpring Boot2を使い始めましょう:

    >> コースをチェックしてください



+