2012-03-19 3 views
1

可能性の重複を使用した場合:
When to use LinkedList<> over ArrayList<>?あなたがjava.util.LinkedListに

これは1のLinkedListのを使用する際に知っている本物の試みです。

java.util.LinkedListはランダムアクセスをサポートしていないため、n番目の要素を取得する唯一の方法は1から(n-1)までスキップするか、get(n)を使用することです非常に非効率的です。 なぜLinkedListを使用するのですか? ListIteratorを使用して両側からコレクションを反復しない限り、ArrayListはほとんどの場合役に立ちます。

+1

n番目の要素がランダムアクセスのように聞こえることを確認します。 –

+0

@Steve Kuo、LinkedListはランダムアクセスを許可していません。 get(n)を実行できますが、そのメソッド自体の実装は1から(n-1)までスキップして開始します。したがってランダムアクセスではない – sachinrahulsourav

答えて

4

は、この方法について考えてみよう:

大規模なリストについては
List list = // choose your list here 
list.add(0, new Object()); 

LinkedListが重くArrayListを-実行します。同じことが

list.remove(0); 

...など多くの方法に当てはまります。詳細については、java.util.Dequeインターフェイスについてもお読みください。LinkedList

+0

list.remove()はIteratorインターフェイスからのものであり、この操作の効率はArrayListでも同じです。 List.add()まで、リストのどこかに要素を追加することは、LinkedListを持つ大きなリストに対して効率的です。 – sachinrahulsourav

+2

@sachinrahulsourav: 'remove(int)'のソースコードを見てください。 'ArrayList'は' System.arraycopy'を呼び出しますが、 'LinkedList'はいくつかの参照を更新します...インターフェースで宣言されても、実装の事実には影響しません...' remove(int) ' 'Iterator'では宣言されていませんが、' List'で宣言されています... –

+0

そうです。私はちょっと気付きましたが、remove()はコピーをして参照を更新する必要があります – sachinrahulsourav

2

これらの種類のデータ構造では、ランダム要素アクセス、要素の追加、および要素の削除の3つの共通の演算子を検討してください。

ランダムな要素へのアクセスが遅い(O(N))、追加と削除が高速です(O(1) )が、追加と削除要素が遅くなります。

あなたは、あなたのシステムが適切なデータ構造の多くを行うと、使用するどの操作を見てする必要があります。

+0

どこから要素を挿入または削除しますか?それはO(n)である可能性があります。 –

+0

@ TomHawtin-tacklineその要素のリストノードの検索を含める場合のみ。いくつかのケースでは、あなたはすでにそれを持っている、または一定の時間にそれを得ることができます。そして、あなたが検索しなければならない多くの場合、配列を持っていても、とにかく検索しなければなりません。 – delnan

-1

LinkedList挿入用)ArrayListと比較して(より適し/任意のインデックスの削除。ArrayListから挿入または削除する場合は、内部配列をシフトする必要があります。LinkedListの場合は、ノードのポインタ

+0

任意のインデックスのですか?両方のO(n)。 'ArrayList'だけが一般的により速い要素になります。 –

関連する問題