JavaでのArrayListとLinkedListの違い
コンテンツ
ArrayListとLinkedListは コレクション クラス、およびそれらの両方は リスト インタフェース。 ArrayListクラスは、内部的に保存されるリストを作成します 動的 アレイ 要素が追加または削除されると、サイズが拡大または縮小します。 LinkedListは、内部的に保存されるリストも作成します 二重に リンク済み リスト。両方のクラスはリストに要素を保存するために使用されますが、ArrayListクラスとLinkedListクラスの主な違いは 配列リスト リスト上の要素へのランダムなアクセスを許可します インデックスベース データ構造。一方、 LinkedList 要素に直接アクセスするためのインデックスがないため、ランダムアクセスは許可されません。リストから要素を取得またはアクセスするには、リストを走査する必要があります。
以下に示す比較チャートを使用して、ArrayListとLinkedListのいくつかの違いについて説明します。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | 配列リスト | LinkedList |
---|---|---|
ベーシック | ArrayListを使用すると、リスト内の要素にランダムにアクセスできます。 | LinkedListは、リスト内の要素へのランダムアクセスを許可しません。 |
データ構造 | 要素の保存に使用される内部構造は、動的配列です。 | 要素を格納するために使用される内部構造は、二重リンクリストです。 |
拡張する | ArrayListはAbstarctListクラスを拡張します。 | LinkedListは、AbstractSequentialListを拡張します。 |
実装する | AbstractListはListインターフェイスを実装します。 | LinkedListは、List、Deque、Queueを実装します。 |
アクセス | ArrayListでは、リスト内の要素へのアクセスが高速になりました。 | LinkedListでは、リスト内の要素へのアクセスが遅くなります。 |
操作 | ArrayListでは、リスト内の要素の操作が遅くなります。 | LinkedListでは、リスト内の要素の操作が高速になりました。 |
動作 | ArraylListはリストを実装するため、リストとして動作します。 | LinkedListは、ListとQueueの両方を実装するため、Queueと同様にListとして動作します。 |
ArrayListの定義
の AbstractList クラスは 収集フレームワーク。伸びる AbstarctList 実装する リスト インタフェース。 ArrayListの使用 動的配列 つまり、リストに要素を格納するための内部データ構造としての可変長の配列。 javaの配列は固定長であるため、ArrayListの必要性が生じます。したがって、要素が配列に追加または削除されるときに、サイズを拡大または縮小することはできません。そのため、必要な配列のサイズを事前に知る必要があります。ただし、ArrayListクラスを使用して実装された配列リストは、要素が配列に追加または削除されると、サイズが拡大または縮小する可能性があります。
ArrayListを使用して実装された配列リストにアクセスできます 無作為に ArrayListはインデックスベースで動作するため。インデックスを知っていれば、リストの要素に直接アクセスできます。 ArrayListには3つのコンストラクターがあります。
ArrayList()ArrayList(Collection <?extends E> c)ArrayList(int capacity)
の 最初 コンストラクターは空の配列リストを実装します。の 第二 コンストラクタは、を使用して初期化された配列リストを実装します コレクションc 要素。の 三番 コンストラクターは配列リストを実装します 容量 引数で提供されます。 ArrayListを使用して、Collection ArrayListを配列に変換する必要がある場合があります。それを呼び出すことによって行うことができます toArray().
LinkedListの定義
ArrayListと同様に、 LinkedList またです コレクション クラスが使用する 二重リンクリスト リスト内の要素を保存するための内部データ構造として。 LinkedListクラスは拡張します AbstractSequentialList を実装します リスト, デケ そして キュー インターフェース。 LinkedListを使用して実装されたリンクリストには、ランダムにアクセスできません。リストから要素を取得する場合は、その要素を検索するためにリストを反復する必要があります。
LinkedListクラスには2つのコンストラクターがあります。
LinkedList()LinkedList(Collection <?extends E> c)
の 最初 コンストラクターは、空のリンクリストを作成します。の 第二 コンストラクタは、のリストで初期化されたリンクリストを作成します コレクション c.
LinkedListでは、リストの操作は簡単で高速です。これは、リスト内の要素を追加または削除する場合、ArrayListのように要素をシフトする必要がないためです。ただし、要素に直接アクセスするためのインデックスがないため、アクセスは遅くなります。
- ArrayListは配列のインデックスベースのデータ構造を採用しているため、ArrayListによって実装されたリストにはランダムにアクセスできます。一方、LinkedListによって実装されたリストは、リスト内の特定の要素を取得またはアクセスするにはリストを走査する必要があるため、ランダムにアクセスできません。
- ArrayListがリストの要素を保存するために使用する内部データ構造は、 動的配列 要素がリストに追加またはリストから削除されると、拡大または縮小する可能性があります。ただし、LinkedListがリスト内の要素を保存するために使用する内部データ構造は次のとおりです。 二重リンクリスト.
- ArrayListは、 AbstractList CollectionクラスでもあるLinkedListクラスは、 AbstractSequentialList 再びCollectionクラスであるクラス。
- ArrayListクラスの実装 リスト 一方、LinkedListクラスは リスト, キュー、そして デケ インターフェース。
- ArrayListを使用して実装されたリストから要素にアクセスするのは もっと早く インデックスベースのデータ構造を持っているためです。一方、byLinkledListを実装するリストにはインデックスベースの構造はありません。したがって、アクセスされる要素に到達するためにリストに反復子が適用され、アクセスが行われます もっとゆっくり LinkedListで。
- ArrayListを使用して実装されたリスト内の操作は、リストに要素が追加または削除されるたびに、リスト内の要素が変更に合わせてシフトされるためです。一方、LinkedListによって実装されたリストでは、リストへの要素の追加または削除時にリスト内の要素を移動する必要がないため、操作が高速になります。
- ArrayListは リスト Listインターフェースを実装するのに対し、LinkedListは リスト そして キュー ListとQueueの両方を実装します。
結論:
リスト内の要素が頻繁に追加または削除される場合、操作中のパフォーマンスが向上するため、LinkedListを使用する必要があります。頻繁に検索がリストに適用される場合、リストの要素にアクセスする際のパフォーマンスが向上するため、ArrayListが最適です。