いつJavaでArrayListを使用する必要がありますか?また、いつ配列を使用する必要がありますか?ArrayListはいつJavaの配列よりも優先されますか?
答えて
配列リストは、必要な要素の数が事前に分からない場合に便利です。簡単な例:テキストファイルを読み込み、見つかったすべての単語のリストを作成しています。あなたはあなたのアレイリストに追加し続けることができます、それは成長します。
サイズをあらかじめ宣言する必要がある配列。
配列は固定サイズで宣言する必要があります。したがって、事前に要素の数を知る必要があります。
ArrayListは、必要に応じていくつの要素を必要とするのかわからない場合には、事前に必要な要素が増えている場合に適しています。
配列の手動実装が必要なAPIで使用できる操作を実行する必要がある場合は、ArrayListを使用することもできます。 (例えばのindexOf)
いくつかの相違点:
- 配列は、その大きさに不変である、あなたはイースリー削除し、要素とのArrayListを使用して、一方の穴を削除することはできません
- 配列は、によって直接処理(高速です簡単です特別なオブジェクトとしてJVM)のArrayListよりと
- 配列は要素(例えば
a.get(i)
対a[i]
にアクセスするための素敵な構文を持っているより少ないメモリを必要とする) - 配列は、例えば(ジェネリックとよくあなたに再生されません汎用配列を作成できません)
- 配列をArrayListとして簡単にラップすることはできません。あなたが必要とするとき、あなたがイースリー
LinkedList
と実装を入れ替えることができList
としてArrayList
を宣言checkedList
、synchronizedList
とunmodifiableList
などのCollections utilsの) - 。この私見では、単なる配列を超える最高の利点
- アレイの
toString
、equals
とhashCode
あなたが要素を追加または削除して、そのサイズを変更したいときは、Arraysクラスユーティリティ
常にArrayListを使用するのはなぜですか? Arrayを展開する必要がない状況がある場合、なぜArrayListを使用するのですか?または、ArrayListのオーバーヘッドはごくわずかですか? – pave
ほとんどの場合、実装自体にArrayを使用しているため、そうだと私は言います。 リストとコレクションに付属している素敵なものを使う方が便利です。最終的にパフォーマンスの問題が発生した場合は、リストが実際にボトルネックであるかどうかを確認して削除できます。 – Janusz
LinkedList(非常にまれにしか必要とされない)を置換する能力よりもずっと有用なのはCollections.singletonList()とemptyList()を使用できることです。 –
を使用しなければならない、奇妙なエラーが発生しがちですされています。
CollectionやIterableが必要なものに渡したいとき(Arrays.asList(a)を使って配列を作ることはできますが、aはListのように見えます)。
ポイントの別のカップル:
- あなたは一次元(例えば、マトリックス)より多くを表現するために、配列を使用して検討する必要があります。
- 配列は、プリミティブを格納するために使用でき、ArrayListを使用するよりも、よりコンパクトなデータ表現を提供します。
+1彼らは両方とも非常に良い点です – dfa
私はむしろ適切なインターフェイスを持つ実際のクラスで表される行列を持っています。これは二次元配列を内部的に使うかもしれないので、私はその使い方に同意しますが、マトリックスを表す一般的なインターフェースとしては同意しません。 – VoidPointer
@ VoidPointer - 一般的に私はあなたの意見に同意しますが、それは自分が行っていたナンバー・クランチングがどれほど集中的であるかによって異なります。 – Adamski
私は、あなたが特別な必要がない限り、あなたのコードの柔軟性を高め、エラーを起こしにくいという理由だけで、ArrayListを使うべきだと言います。 500行のコードを余分に追加すると宣言サイズを拡張する必要はありません。また、Listインターフェイスを参照することで、ArrayListをLinkedList、CopyOnWriteArrayList、または多くのコードを変更することなく状況を助けることができる他のリスト実装に置き換えることができます。
言われているように、配列には、リストから抜け出せないいくつかのプロパティがあります。 1つはヌル要素を持つ定義済みのサイズです。これは、連続した順序で物事を保持したくない場合に便利です。例えば、チック・タック・トゥ・ゲーム。
アレイは多次元であってもよい。 ArrayListsはできません。
配列はプリミティブを処理できますが、ArrayListではできません(プリミティブをラップするサードパーティのコレクションクラスがありますが、標準コレクションAPIの一部ではありません)。
JavaにはJava 5以降の自動ボクシングがあるので、ArrayList
これは確かですが、大きな問題がある場合はパフォーマンスの問題を緩和しません。 – Yishai
配列が大きくなる必要があるだけでなく、コレクションが扱いやすくなります。
場合によっては、要素を反復処理するだけでよい場合は、読み取り専用です。しかし、ほとんどの場合、containsなどのメソッドを使用したい場合があります。
ジェネリックアレイを作成することはできないため、「可能性があります」、または気になることはありません。
疑問がある場合は、コレクションを使用すると、APIを使用するユーザーがあなたを愛するようになります:-)。あなただけの配列とそれらを提供する場合、彼らは書くつもりコードの最初の行は、次のとおりです。
Arrays.asList(thatGuyArray);
Arrays.asListはjava.util.ArrayListを返しませんが、ArrayListに似たプライベートクラスのみ – dfa
はい、私はそれを認識しています:-)、しかし、それを言及してくれてありがとう、それは誰かの役に立つかもしれません。 –
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);
}
私は、java.util.Listに依存する必要があることを付け加えています。これは、ほとんどの場合、かなり簡単に実装をスワップできます。 –
良い点。私は答えにそれを加えました。 – VoidPointer
やあ:
ニック・ホルトさんのコメントを1として、あなたはリストのどこのArrayListであるという事実を公開するべきではありませんこれまでのところ。 ArrayListのオブジェクト・タイプの混合物を含むことができる容器であるのに対し、アレイのみアレイ自体である場合、配列は、その内容の型を宣言しなければならない
- 宣言された。 ArrayListは、ArrayListが宣言されたときにその内容の型を宣言する必要はありません。
- 配列の特定の場所に項目を挿入する必要があります。 ArrayListへの追加はコンテナのadd()メソッドによって行われ、
- オブジェクトは配列に格納され、配列には特定の型のオブジェクトしか格納できないため、型が保持されます。オブジェクトは、スーパークラス型Objectを使用してArrayListに格納されます。
編集: Ooop。リストの最後の点に関して、私はあなたがオブジェクトの配列を持っている特別な場合を忘れていました。そして、これらの配列はどんなタイプのオブジェクトも含むことができます。コメントありがとう、Yishai! ( - :
HTH
歓声、
オブジェクト[]配列を持っている場合は、配列リストと同様に、あらゆる種類のオブジェクトを含めることができます。 – Yishai
私はこれらの4つのいずれもが書かれているように真実ではないと思います.... –
- 1. 配列が配列よりも優れているのはいつですか?
- 2. なぜ算術+はテキストよりも優先されますか?
- 3. CompareAttributeのエラーがRequiredAttributeよりも優先されます
- 4. 地図のクリックイベントがグラフィッククリックイベントよりも優先されます
- 5. .Net - リストはいつですか<T> .ForEachは標準のforeachループよりも優先されますか?
- 6. Application_ErrorがPage_Errorよりも優先されます
- 7. インターフェイスのカスタムイベントは、デフォルトのフォームイベントよりも優先されますか?
- 8. border-leftの色はborder-radiusよりも優先されますか?
- 9. React.jsはjqueryよりも制御された入力を優先しますか?
- 10. 呼び出し可能はRunnableよりも優先されますか?
- 11. は@Column columnDefinitionの@Temporalより優先されますか?
- 12. デフォルトのボタンは、リッチテキストコントロールの入力よりも優先されます
- 13. foreachループ内のArray_pushは以前のarrey値よりも優先されます
- 14. ログイン領域のインライン幅は、CSSのデフォルトよりも優先されます
- 15. モジュールの引数は関数の引数よりも優先されます
- 16. CSSの一般要素がクラスよりも優先されますか?
- 17. CSSルールの上書きはいつ優先されますか?
- 18. 優先キューのArrayList HashMapの
- 19. index.htmlがindex.phpよりも優先されるのはなぜですか?
- 20. 定義されたシンボル(定数)よりも文字列が優先されるのはなぜですか?
- 21. Javascript配列:2つの配列を優先的にマージする
- 22. javadoc.jarをsources.jarのjavadocよりも優先させるには?
- 23. regexパターンの優先順位を他のパターンよりも優先する方法
- 24. CSSアトリビュートセレクタが通常のCSSクラスセレクタよりも優先されます
- 25. Wordpressのページはサーバのディレクトリより優先されない
- 26. なぜレキシカルスコープがコンパイラより優先されますか?
- 27. `body.className div.className`は` div.className.className2`よりどのように優先されますか?ここ
- 28. バックグラウンドスレッドは、フォアグラウンドスレッドより低い優先順位で実行されますか?
- 29. レガシーコンストラクター違反:レガシーコンビネーション関数よりもスウィートコンストラクターが優先されます。 (legacy_constructor)
- 30. SVGKit:パフォーマンスとPNGよりも優先されるべきですか?
重複:http://stackoverflow.com/questions/412813/when-to-use-arraylist-over-array –
@michael:私はこのことを考えます質問はより完全な回答 – dfa
@dfa:これは私たちが回答を複製することを意味するものではありません。 "真の方法"は元の質問の新しい回答を更新/投稿することです。 –