web-dev-qa-db-ja.com

いつJavaの配列でリストを使用するのですか?

Javaでは、配列ではなくリストを使用するほうが好ましい場合はいつですか?

32
John Moffitt

私は質問が反対であると思います

リストに対して配列を使用する必要があるのはいつですか?

特定の理由がある場合のみ(例:プロジェクトの制約、メモリの問題(実際には適切な理由ではない)など)

リストははるかに使いやすく(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。ベンローズ

39
Tom Neyland

経験則:

  • 参照タイプにはListを使用します。
  • プリミティブには配列を使用します。
  • 配列を使用しているAPIを処理する必要がある場合は、配列を使用すると便利です。 OTOH、Listsを使用して型システムで防御コピーを実施すると便利な場合があります。
  • シーケンスで多くのListタイプの操作を実行していて、パフォーマンス/メモリのクリティカルセクションにない場合は、Listを使用します。
  • 低レベルの最適化では配列を使用できます。低レベルの最適化により、おいしさを期待してください。
16

ほとんどの人はすでにそれに答えています。

Listの代わりに配列を使用する正当な理由はほとんどありません。主な例外は、プリミティブ配列(int[]など)です。プリミティブリストを作成することはできません(List<Integer>が必要です)。

最も重要な違いは、Listを使用するときに、どの実装を使用するかを決定できることです。最も明白なのは、LinkedListまたはArrayListを選択することです。

この回答で指摘したいのは、実装を選択すると、配列で使用できないデータを非常にきめ細かく制御できることです。

  1. リストをCollection.unmodifiableListでラップすることで、クライアントがリストを変更できないようにすることができます
  2. Collection.synchronizedListを使用して、マルチスレッドのリストを同期できます
  3. LinkedBlockingQueueの実装で固定長キューを作成できます
  4. ...など

いずれにせよ、リストの追加機能が(今のところ)必要ない場合でも。 ArrayListを使用して、作成した配列のサイズに合わせてサイズを調整するだけです。バックエンドで配列を使用し、実際の配列とのパフォーマンスの違いは無視できます。 (プリミティブ配列を除く)

10
vdr

ほとんど常にリストを好む。リストにはより多くの機能があり、特にイテレータのサポートがあります。 toArray()メソッドを使用すると、いつでもリストを配列に変換できます。

7
Chris Kessel

常にリストを好む。

配列

  1. メソッドのVarargs(ここでは配列を使用せざるを得ないと思います)。
  2. コレクションを共変にしたい場合(参照型の配列は共変です)。
  3. パフォーマンスが重要なコード。
4
Surya

保持するものの数がわかっている場合は、配列が必要になります。私の画面は1024x768で、そのためのピクセルのバッファーのサイズはevery実行時に変更されません。

特定のインデックスにアクセスする必要があることがわかっている場合は(アイテム#763を取得してください!)、配列または配列を使用したリストを使用します。

定期的にグループにアイテムを追加または削除する必要がある場合は、リンクリストを使用してください。

一般的に、ハードウェア、アレイ、ユーザー、リストを扱います。

2
Dean J

リストの種類によって異なります。

末尾以外の場所に多くの要素を挿入することがわかっている場合は、LinkedListを使用することをお勧めします。 LinkedListはランダムアクセス(i番目の要素の取得)には適していません。

要素の数が事前にわからない場合は、ArrayListを使用することをお勧めします。 ArrayListは、要素を追加するときにバッキング配列を拡張するコストを正しく償却し、要素が配置された後のランダムアクセスに適しています。 ArrayListは効率的にソートできます。

1

項目の配列を拡張したい場合(つまり、リストのサイズが事前にわからない場合)、リストは有益です。ただし、パフォーマンスが必要な場合は、通常、配列を使用します。

0
user153498

多くの場合、使用されるコレクションのタイプは、外部の世界に公開されるべきではない実装の詳細です。 returntypeが一般的であるほど、後で実装を変更する際の柔軟性が高くなります。

配列(プリミティブ型、つまり新しいint [10])は一般的ではないため、内部変換やクライアントコードの変更なしに実装を変更することはできません。 Iterableをreturntypeとして検討することもできます。

0
p3t0r