ホームページ Java &#&チュートリアル JavaのVectorとArrayListの違い

JavaのVectorとArrayListの違い

Nov 16, 2016 pm 01:13 PM
java

まず、両方のカテゴリが List インターフェイスを実装しており、List インターフェイスには ArrayList、Vector、LinkedList という 3 つの実装クラスがあることを確認してください。リストは複数の要素を格納するために使用され、要素の順序を維持でき、要素の複製が可能です。 3 つの特定の実装クラスの関連する違いは次のとおりです。

ArrayList は、最も一般的に使用される List 実装クラスであり、配列を通じて内部的に実装され、要素への高速なランダム アクセスが可能になります。配列の欠点は、各要素間にギャップを設けることができないことです。配列のサイズが満たされない場合、記憶容量を増やす必要があり、既存の配列のデータを新しい記憶領域にコピーする必要があります。 ArrayList の途中で要素を挿入または削除する場合は、配列をコピーして移動する必要があり、比較的コストがかかります。したがって、ランダムな検索や走査には適していますが、挿入や削除には適していません。

Vector も ArrayList と同様に配列を通じて実装されますが、違いはスレッド同期をサポートしていることです。つまり、同時に 1 つのスレッドが Vector に書き込むことができ、複数のスレッドが同時に書き込むことによって生じる不一致を回避できます。 、同期を達成するのに多くの時間がかかるため、ArrayList にアクセスするよりも時間がかかります。

LinkedList はリンクされたリスト構造を使用してデータを保存します。これは、データの動的な挿入と削除に非常に適しており、比較的低速です。さらに、List インターフェイスで定義されていないメソッドも提供します。これらは、特にリストの先頭要素と末尾要素を操作するために使用され、スタック、キュー、および双方向キューとして使用できます。

Java ソースコードを見ると、配列のサイズが十分でない場合は、配列を再作成してから、ArrayList と の拡張配列のサイズを新しい配列にコピーする必要があることがわかりました。ベクトルが違います。

ArrayList内:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

public boolean add(E e) {

  

    ensureCapacity(size + 1);  // 增加元素,判断是否能够容纳。不能的话就要新建数组

   

    elementData[size++] = e;

  

    return true;

  

}

  

 public void ensureCapacity(int minCapacity) {

  

    modCount++;

  

    int oldCapacity = elementData.length;

  

    if (minCapacity > oldCapacity) {

  

        Object oldData[] = elementData; // 此行没看出来用处,不知道开发者出于什么考虑

   

        int newCapacity = (oldCapacity * 3)/2 + 1; // 增加新的数组的大小

   

        if (newCapacity < minCapacity)

  

       newCapacity = minCapacity;

  

            // minCapacity is usually close to size, so this is a win:

   

            elementData = Arrays.copyOf(elementData, newCapacity);

  

    }

  

}

ログイン後にコピー

Vector内:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

private void ensureCapacityHelper(int minCapacity) {

  

    int oldCapacity = elementData.length;

  

    if (minCapacity > oldCapacity) {

  

        Object[] oldData = elementData;

  

        int newCapacity = (capacityIncrement > 0) ?

  

       (oldCapacity + capacityIncrement) : (oldCapacity * 2);

  

        if (newCapacity < minCapacity) {

  

       newCapacity = minCapacity;

  

        }

  

         elementData = Arrays.copyOf(elementData, newCapacity);

  

    }

  

}

ログイン後にコピー

ArrayListとVectorの違いは以下の通りです:

ArrayListはメモリ不足時にデフォルトで50%+1倍に拡張し、Vectorはデフォルトで1倍に拡張します。

Vector は、indexOf(obj, start) インターフェイスを提供しますが、ArrayList は提供しません。

Vector はスレッド セーフですが、スレッド セーフにはより大きなシステム オーバーヘッドが必要となるため、Vector はほとんどの場合使用されません。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Javaの平方根

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Javaの完全数

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーター

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Javaのアームストロング数

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

ジャワのウェカ

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Javaのスミス番号

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

Java Springのインタビューの質問

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8 Stream Foreachから休憩または戻ってきますか?

See all articles