2011-01-30 20 views
14

可能性の重複:
Benefits of arraysArrayListsよりもArrayを好む理由はありますか?

ちょっとそこ、

ArrayLists (List<MyObject>)Arrays (MyObject[])を好むためにあらゆる理由がありますか?配列を使用する左の唯一の場所は、プリミティブ型(int、booleanなど)です。しかし私はこれについて合理的な説明がない、ちょうどコードを少しスリムにする。

一般に、私はリストを使用してより柔軟性を維持しています。しかし、実際の配列を使用する理由が残っていますか?

私が知りたいのですが、 よろしく

+1

[配列の利点] /stackoverflow.com/questions/2843928/benefits-of-arrays)。一般的に、ここでArrayListとArrayの質問がたくさんあります。 –

+0

なぜこれをマージして削除しないのですか? – bestsss

答えて

1

一般配列は、例えば、彼らの問題を持っていますタイプセーフティ:

Integer[] ints = new Integer[10]; 
Number[] nums = ints; //that shouldn't be allowed 
nums[3] = Double.valueOf[3.14]; //Ouch! 

これらはいずれもコレクションでうまく動作しません。だからgenerelly配列を介してコレクションを好むべきです。配列がより便利になるかもしれないいくつかのことがあります。すでに述べたように、プリミティブ型は理由になります(ただし、Troveのようなコレクションのようなライブラリの使用を検討することはできます)。配列がオブジェクト内に隠れていてサイズを変更する必要がない場合は、配列を使用することができます(特に3Dグラフィックスの3Dおよび4Dベクトルと行列など)。 APIに多くのvarargsメソッドがある場合、配列を使用するもう1つの理由があります。

ところで:それは最終的でなければならないとあなたは、int型の変数でこれを行うことはできません

public void f() { 
    final int[] a = new int[1]; 
    new Thread(new Runnable() { 
     public void run() { 
     while(true) { 
      System.out.println(a[0]++); 
     } 
     }  
    }).start(); 
} 

注:匿名クラスのために変更可能な変数が必要な場合は、配列を使用したキュートなトリックがあります。あなたのための

0

1:

(j.u.Collections経由)リストをソートするには、最初に(マージソートのために[]もう一度複製した)、その後、一覧に戻し、その後、ソートされた[]に変換されます。 あなたは、ArrayListがカバーの下にバッキングオブジェクト[]を持っていることを理解しています。

この日は、ArrayList.getが-client hotspotコンパイラによってインライン展開されていないケースがありましたが、修正されたと思います。したがって、ObjectListと比較してArrayListを使用した場合のパフォーマンスの問題はそれほど厳しくありません。適切な型にキャストされるケースはまだ数クロックあります(しかし、CPUによって予測される時間の99.99%である必要があります)。 ArrayListの要素にアクセスするともう1つのキャッシュミスが発生する可能性があります(ほとんどの場合、1回目のアクセス)

最後にコードを実行することに依存します。

編集 を使用すると、配列の要素に原子アクセス(すなわち、CASのもの)を有することができる忘れ一IMPLはj.u.c.atomic.AtomicReferenceArrayあります。 Objec [] []のCASを許可していないのでUnsafeが救助に来るので、実際的なものではありません。

0

配列とリストの主な違いは、配列の長さが固定されていると思います。一度それがいっぱいになると、いっぱいです。 ArrayListsは柔軟な長さを持ち、実装する配列を使用します。arrayListの容量が足りなくなると、データは容量の大きい別の配列にコピーされます(これは私が一度教えたものです)。

データ長を固定しても配列を使用することができます。配列はかなりプリミティブなので、呼び出すメソッドはほとんどありません。 arrayListsはJavaや他の言語で必要なものに適したラッパーなので、これらの配列を使用する利点はそれほど大きくありません。

私はあなたが今日arraylistsに固定容量を設定することもできると思うので、その利点が崩壊する。

これを好む理由は何ですか?おそらくそうではありませんが、基本的な機能のために、メモリに少しだけスペースがあることを確認します。 arraylistはかなり大きなラッパーであり、常に必要としない柔軟性を持っています。

+0

> "arraylistはかなり大きいラッパーであり、いつも欲しいものではないが、多くの柔軟性を持っていますか?<これは本当ではありません(実際は薄いラッパーパーツです。追加の未使用スペース – bestsss

+0

@bestsss ArrayListsは余分な容量を持つ配列を作成しますので、最初は必要ないかもしれない余分なスペースがありますarraylistに入れたオブジェクトのタイプによって、arraylistは大きくなります – Marnix

+0

> arraylistに入れたオブジェクトのタイプによって、arraylistは余分な容量 bestsss

8

固定数の要素でしか動作しないことがわかっているときはいつも、私は秒をArrayList秒以上使用することをお勧めします。私の理由は、主に主観的であるが、私はとにかくそれらをここにリストアップしています:彼らはオートボクシングやラッパーを使用する必要があるためプリミティブのCollectionクラスを使用

  1. はかなり遅くなります。

  2. ArrayListget()を超える要素にアクセスするために、より簡潔な[]構文が好きです。これは、多次元配列が必要なときには、もっと重要になります。

  3. ArrayList通常、アイテムを非常に高速に追加できるように、今すぐ必要なメモリの約2倍を事前に割り当てます。これ以上アイテムを追加しない場合、無駄があります。

  4. (おそらく前の点に関連しています)私はArrayListのアクセスが一般的なプレーンな配列よりも遅いと思います。 ArrayListの実装では基本配列が使用されますが、すべてのアクセスはget(),set(),remove()などのメソッドを経由する必要があります。つまり、単純な配列アクセスよりも多くのコードを処理します。しかし、私は実際に違いをテストしていないので、私は間違っている可能性があります。

これは言いましたが、その選択は実際に必要なものによって決まると思います。固定数の要素が必要な場合や、複数の次元を使用する場合は、単純な配列をお勧めします。しかし、あなたが単純なランダムアクセスリストを必要とし、それにたくさんの挿入と削除をしようとしているのであれば、それはもっと便利です。Arraylist

関連する問題