Javaでは、配列ではなくリストを使用するほうが好ましい場合はいつですか?
私は質問が反対であると思います
リストに対して配列を使用する必要があるのはいつですか?
特定の理由がある場合のみ(例:プロジェクトの制約、メモリの問題(実際には適切な理由ではない)など)
リストははるかに使いやすく(imo)、はるかに多くの機能を備えています。
注:セットやその他のデータ構造が、リストよりも、実行しようとしていることに適しているかどうかも検討する必要があります。
各データ構造と実装には、長所と短所があります。あなたがする必要がある事柄に優れているものを選んでください。
Get()がO(1)である必要がある場合、ArrayListを使用する可能性があります。必要な場合O(1) insert()?おそらくリンクリスト。O(1) contains()?が必要か?おそらくハッシュセット。
TLDR:各データ構造はいくつかの点で長所と短所があります。目的を見て、与えられた問題に最適なデータ構造を選択してください。
編集:
言及されていないことの1つは、変数をその実装クラスではなく、そのインターフェース(つまり、リストまたはキュー)として宣言した方がよいことです。この方法では、コードの他の部分を変更することなく、後日実装を変更できます。
例として:
List<String> myList = new ArrayList<String>();
対
List<String> myList = new LinkedList<String>();
どちらの例でも、myListはリストであることに注意してください。 --R。ベンローズ
経験則:
List
を使用します。List
sを使用して型システムで防御コピーを実施すると便利な場合があります。List
タイプの操作を実行していて、パフォーマンス/メモリのクリティカルセクションにない場合は、List
を使用します。ほとんどの人はすでにそれに答えています。
Listの代わりに配列を使用する正当な理由はほとんどありません。主な例外は、プリミティブ配列(int[]
など)です。プリミティブリストを作成することはできません(List<Integer>
が必要です)。
最も重要な違いは、Listを使用するときに、どの実装を使用するかを決定できることです。最も明白なのは、LinkedListまたはArrayListを選択することです。
この回答で指摘したいのは、実装を選択すると、配列で使用できないデータを非常にきめ細かく制御できることです。
Collection.unmodifiableList
でラップすることで、クライアントがリストを変更できないようにすることができますCollection.synchronizedList
を使用して、マルチスレッドのリストを同期できますLinkedBlockingQueue
の実装で固定長キューを作成できますいずれにせよ、リストの追加機能が(今のところ)必要ない場合でも。 ArrayListを使用して、作成した配列のサイズに合わせてサイズを調整するだけです。バックエンドで配列を使用し、実際の配列とのパフォーマンスの違いは無視できます。 (プリミティブ配列を除く)
ほとんど常にリストを好む。リストにはより多くの機能があり、特にイテレータのサポートがあります。 toArray()メソッドを使用すると、いつでもリストを配列に変換できます。
常にリストを好む。
配列
保持するものの数がわかっている場合は、配列が必要になります。私の画面は1024x768で、そのためのピクセルのバッファーのサイズはevery実行時に変更されません。
特定のインデックスにアクセスする必要があることがわかっている場合は(アイテム#763を取得してください!)、配列または配列を使用したリストを使用します。
定期的にグループにアイテムを追加または削除する必要がある場合は、リンクリストを使用してください。
一般的に、ハードウェア、アレイ、ユーザー、リストを扱います。
リストの種類によって異なります。
末尾以外の場所に多くの要素を挿入することがわかっている場合は、LinkedListを使用することをお勧めします。 LinkedListはランダムアクセス(i番目の要素の取得)には適していません。
要素の数が事前にわからない場合は、ArrayListを使用することをお勧めします。 ArrayListは、要素を追加するときにバッキング配列を拡張するコストを正しく償却し、要素が配置された後のランダムアクセスに適しています。 ArrayListは効率的にソートできます。
項目の配列を拡張したい場合(つまり、リストのサイズが事前にわからない場合)、リストは有益です。ただし、パフォーマンスが必要な場合は、通常、配列を使用します。
多くの場合、使用されるコレクションのタイプは、外部の世界に公開されるべきではない実装の詳細です。 returntypeが一般的であるほど、後で実装を変更する際の柔軟性が高くなります。
配列(プリミティブ型、つまり新しいint [10])は一般的ではないため、内部変換やクライアントコードの変更なしに実装を変更することはできません。 Iterableをreturntypeとして検討することもできます。