2009-08-17 6 views
6

いつJavaでArrayListを使用する必要がありますか?また、いつ配列を使用する必要がありますか?ArrayListはいつJavaの配列よりも優先されますか?

+0

重複:http://stackoverflow.com/questions/412813/when-to-use-arraylist-over-array –

+0

@michael:私はこのことを考えます質問はより完全な回答 – dfa

+0

@dfa:これは私たちが回答を複製することを意味するものではありません。 "真の方法"は元の質問の新しい回答を更新/投稿することです。 –

答えて

5

配列リストは、必要な要素の数が事前に分からない場合に便利です。簡単な例:テキストファイルを読み込み、見つかったすべての単語のリストを作成しています。あなたはあなたのアレイリストに追加し続けることができます、それは成長します。

サイズをあらかじめ宣言する必要がある配列。

3

配列は固定サイズで宣言する必要があります。したがって、事前に要素の数を知る必要があります。

ArrayListは、必要に応じていくつの要素を必要とするのかわからない場合には、事前に必要な要素が増えている場合に適しています。

配列の手動実装が必要なAPIで使用できる操作を実行する必要がある場合は、ArrayListを使用することもできます。 (例えばのindexOf)

8

いくつかの相違点:

  • 配列は、その大きさに不変である、あなたはイースリー削除し、要素とのArrayListを使用して、一方の穴を削除することはできません
  • 配列は、によって直接処理(高速です簡単です特別なオブジェクトとしてJVM)のArrayListよりと
  • 配列は要素(例えばa.get(i)a[i]にアクセスするための素敵な構文を持っているより少ないメモリを必要とする)
  • 配列は、例えば(ジェネリックとよくあなたに再生されません汎用配列を作成できません)
  • 配列をArrayListとして簡単にラップすることはできません。あなたが必要とするとき、あなたがイースリーLinkedListと実装を入れ替えることができListとしてArrayListを宣言checkedListsynchronizedListunmodifiableListなどのCollections utilsの)
  • 。この私見では、単なる配列を超える最高の利点
  • アレイのtoStringequalshashCodeあなたが要素を追加または削除して、そのサイズを変更したいときは、Arraysクラスユーティリティ
+1

常にArrayListを使用するのはなぜですか? Arrayを展開する必要がない状況がある場合、なぜArrayListを使用するのですか?または、ArrayListのオーバーヘッドはごくわずかですか? – pave

+0

ほとんどの場合、実装自体にArrayを使用しているため、そうだと私は言います。 リストとコレクションに付属している素敵なものを使う方が便利です。最終的にパフォーマンスの問題が発生した場合は、リストが実際にボトルネックであるかどうかを確認して削除できます。 – Janusz

+0

LinkedList(非常にまれにしか必要とされない)を置換する能力よりもずっと有用なのはCollections.singletonList()とemptyList()を使用できることです。 –

2

を使用しなければならない、奇妙なエラーが発生しがちですされています。

CollectionやIterableが必要なものに渡したいとき(Arrays.asList(a)を使って配列を作ることはできますが、aはListのように見えます)。

7

ポイントの別のカップル:

  • あなたは一次元(例えば、マトリックス)より多くを表現するために、配列を使用して検討する必要があります。
  • 配列は、プリミティブを格納するために使用でき、ArrayListを使用するよりも、よりコンパクトなデータ表現を提供します。
+0

+1彼らは両方とも非常に良い点です – dfa

+0

私はむしろ適切なインターフェイスを持つ実際のクラスで表される行列を持っています。これは二次元配列を内部的に使うかもしれないので、私はその使い方に同意しますが、マトリックスを表す一般的なインターフェースとしては同意しません。 – VoidPointer

+0

@ VoidPointer - 一般的に私はあなたの意見に同意しますが、それは自分が行っていたナンバー・クランチングがどれほど集中的であるかによって異なります。 – Adamski

2

私は、あなたが特別な必要がない限り、あなたのコードの柔軟性を高め、エラーを起こしにくいという理由だけで、ArrayListを使うべきだと言います。 500行のコードを余分に追加すると宣言サイズを拡張する必要はありません。また、Listインターフェイスを参照することで、ArrayListをLinkedList、CopyOnWriteArrayList、または多くのコードを変更することなく状況を助けることができる他のリスト実装に置き換えることができます。

言われているように、配列には、リストから抜け出せないいくつかのプロパティがあります。 1つはヌル要素を持つ定義済みのサイズです。これは、連続した順序で物事を保持したくない場合に便利です。例えば、チック・タック・トゥ・ゲーム。

アレイは多次元であってもよい。 ArrayListsはできません。

配列はプリミティブを処理できますが、ArrayListではできません(プリミティブをラップするサードパーティのコレクションクラスがありますが、標準コレクションAPIの一部ではありません)。

+0

JavaにはJava 5以降の自動ボクシングがあるので、ArrayList オブジェクトにintを追加できます。 – VoidPointer

+0

これは確かですが、大きな問題がある場合はパフォーマンスの問題を緩和しません。 – Yishai

4

配列が大きくなる必要があるだけでなく、コレクションが扱いやすくなります。

場合によっては、要素を反復処理するだけでよい場合は、読み取り専用です。しかし、ほとんどの場合、containsなどのメソッドを使用したい場合があります。

ジェネリックアレイを作成することはできないため、「可能性があります」、または気になることはありません。

疑問がある場合は、コレクションを使用すると、APIを使用するユーザーがあなたを愛するようになります:-)。あなただけの配列とそれらを提供する場合、彼らは書くつもりコードの最初の行は、次のとおりです。

Arrays.asList(thatGuyArray); 
+0

Arrays.asListはjava.util.ArrayListを返しませんが、ArrayListに似たプライベートクラスのみ – dfa

+0

はい、私はそれを認識しています:-)、しかし、それを言及してくれてありがとう、それは誰かの役に立つかもしれません。 –

4

Listインタフェース、ArrayListにはJava Collections Frameworkで実装はプレーンなJava配列を持っているものその後、はるかに豊かであるとなっています提供する。 Javaやサードパーティ製のライブラリ全体でのコレクションフレームワークのサポートが比較的広く行われているため、配列の代わりにArrayListを使用することは一般的に意味があります。

  • 彼らは私が
  • プロファイリングは、配列アクセスは、上で重要なスピードアップをもたらすことができる状況でボトルネックを示しを呼んでいるいくつかの他のインターフェースによって必要とされています。本当に彼らのために必要がある場合、私は唯一の配列を使用したいです配列は、このような

    byte[] buffer = new byte[0x400]; // allocate 1k byte buffer 
    

のように、生データのバッファとしてより自然な感じリストアクセス

  • 状況は、必ず取得することができますあなたのArrayListのn個の配列表現あなたは1が必要な場合:

    Foo[] bar = fooList.toArray(new Foo[fooList.size()]) 
    

    それはメソッドがクラスのプライベート配列メンバ(フィールド)への参照を返す一般的な失敗パターンです。これにより、外部の人がクラスのプライベート状態へのアクセスを変更できるため、クラスのカプセル化が中断されます。その結果、配列を常にクローンし、クローンされた配列への参照を返す必要があります。 ArrayListを使用すると、...

    return Collections.unmodifiableList(privateListMember); 
    

    ...実際のリストオブジェクトを保護するラッパーを返すために使用できます。もちろん、リスト内のオブジェクトも不変であることを確認する必要がありますが、変更可能なオブジェクトの(複製された)配列に対しても保持されます。、

    の人が見逃しているように見えるポイントのカップルを

    private List<Foo> fooList = new ArrayList<Foo>(); 
    
    public List<Foo> getFooList() { 
        return Collections.unmodifiableList(fooList); 
    } 
    
  • +1

    私は、java.util.Listに依存する必要があることを付け加えています。これは、ほとんどの場合、かなり簡単に実装をスワップできます。 –

    +0

    良い点。私は答えにそれを加えました。 – VoidPointer

    0

    やあ:

    ニック・ホルトさんのコメントを1として

    、あなたはリストのどこのArrayListであるという事実を公開するべきではありませんこれまでのところ。 ArrayListのオブジェクト・タイプの混合物を含むことができる容器であるのに対し、アレイのみアレイ自体である場合、配列は、その内容の型を宣言しなければならない

  • 、それは異質だ、オブジェクトの一種を含有することができる

    1. 宣言された。 ArrayListは、ArrayListが宣言されたときにその内容の型を宣言する必要はありません。
    2. 配列の特定の場所に項目を挿入する必要があります。 ArrayListへの追加はコンテナのadd()メソッドによって行われ、
    3. オブジェクトは配列に格納され、配列には特定の型のオブジェクトしか格納できないため、型が保持されます。オブジェクトは、スーパークラス型Objectを使用してArrayListに格納されます。

    編集: Ooop。リストの最後の点に関して、私はあなたがオブジェクトの配列を持っている特別な場合を忘れていました。そして、これらの配列はどんなタイプのオブジェクトも含むことができます。コメントありがとう、Yishai! ( - :

    HTH

    歓声、

  • +1

    オブジェクト[]配列を持っている場合は、配列リストと同様に、あらゆる種類のオブジェクトを含めることができます。 – Yishai

    +0

    私はこれらの4つのいずれもが書かれているように真実ではないと思います.... –

    関連する問題