私の直感では、配列は配列リストよりも高速であると言えます。なぜなら、配列リストは、要素がいっぱいになったり失われたりするときにサイズが変更される配列を使用して実装されているからです。
これが正しいかどうかを確認したかっただけで、保持したい要素の数がわかっている場合、配列リストを使用する理由は決してないことを意味します。
私の直感では、配列は配列リストよりも高速であると言えます。なぜなら、配列リストは、要素がいっぱいになったり失われたりするときにサイズが変更される配列を使用して実装されているからです。
これが正しいかどうかを確認したかっただけで、保持したい要素の数がわかっている場合、配列リストを使用する理由は決してないことを意味します。
特に配列リストinitialCapacity
を. コードは、最も読みやすく保守しやすい方法で記述し、パフォーマンスが大幅に向上することがテストによって判断されない限り、このような最適化は行わないでください。
使用する潜在的な理由ArrayList
:
contains
など)Iterable
、Collection
、および を実装List
しているため、インターフェースベースの多くの API 呼び出しで使用できます。ArrayListは、生の配列にはない多くの機能を提供します。要素の数がわかっている場合は、そのサイズのArrayListを作成できます。
new ArrayList<String>(100);
ArrayListと配列の速度の違いを心配している場合は、間違ったことを心配しています。コードのボトルネックになる可能性はほとんどありません。もしそうなら、配列に変更するよりもほぼ確実に良い答えがあります。
時期尚早の最適化に屈しないでください。それはあなたのコードに大混乱をもたらすでしょう。ほとんどのことは重要ではありませんが、重要なことはごくわずかです。コードをプロファイリングすることによってのみ、これらのいくつかのものを見つけることができます。すべての部分を高速化しようとすることは、全体を高速化するための非常に効果のない方法です。クリーンでシンプルなデザインを維持することは、はるかに効果的です。これにより、実際に必要な1つまたは2つの場所に最適化を導入するために必要な継ぎ目が得られます。
ArrayList
単純なget/setで高速化することはできませんが、その差は非常に小さく、ほとんどすべての現実的なシナリオで心配する価値はないでしょう。
List
APIには、サイズが修正されることがすでにわかっている場合でも、必要になる可能性のあるいくつかのメソッドがあります。contains()
たとえば考えてみてください。リストが固定サイズであることがわかっている場合でもArrayList
、Iterator
またはAPIが必要な場合にも-を使用する必要があります。List
他の人がすでに言っているように、パフォーマンス ベンチマークでボトル ベックであると言われない限り、ArrayList を使用してください。
はい、アクセサーのオーバーヘッドによるパフォーマンスの違いがありますが、これは一般的に重要ではありません。その一般的なルールの例外は、ArrayList 内にプリミティブ型を格納している場合です。これにより、オブジェクトとオブジェクトおよびプリミティブ型の間の変換が行われるため、パフォーマンスが大幅に低下します。
// easier to work with but slow
ArrayList<Double> slowList;
// faster primitive data array
double[] fasterList;
はい、アレイははるかに高速です。数値アルゴリズムを実行すると、顕著なスピードアップが見られます。
ただし、通常のアプリケーションの目的では、それについて心配する必要はありません。これは、ランタイムのほとんどがとにかく他のことを行うために費やされているためです。
コードを早めに最適化するのではなく、コードに最適なデータ構造を使用してください。あなたが言ったように、経験則は次のようになります。
要素の数がわからないか、大きく変化しています=>リスト(実装に固執しないでください)
要素の数は事前にわかっている固定されています=>配列
アレイのサイズがわかっている場合は、アレイが拡大または縮小しないことを確認してください。配列を使用するよりも。わからない場合は、配列リストが望ましく、安定しています。パフォーマンスに関しては、これがあなたの唯一の懸念事項ですか?一緒に移動..