3

私はJavaを初めて使用するので、本質的な問題に気づいていません。
パラメータ化されたArrayListのジェネリック配列を作成できないのはなぜですか?
代わりに私は書かなければなりません、

ArrayList<String>[] alist = new ArrayList[10]; 

または、ArrayListsのリストを作成する必要があります。
配列はArrayListsよりも効率的であると考えられていませんか?では、なぜJavaはそれを許可しないのでしょうか。
また、次の2行の違いは何ですか。

ArrayList<String>[] alist = new ArrayList[10];  
ArrayList<String>[] alist = new ArrayList<?>[10];  
4

4 に答える 4

2

実際、ArrayList の実装は、リストのサイズを変更しない読み取りおよび書き込みアクションに対して非常に効率的です。多くの場合 (少なくとも Java 1.6 以降)、コンパイラはメソッド呼び出しのオーバーヘッド (たとえば get()) を完全に取り除きます。

また、多くのプログラムが配列が提供するパフォーマンスを必要とするわけではないので、コードが遅すぎるまでは配列の使用について心配する必要はありません (それでもおそらく配列は必要ありません)。

于 2010-03-21T18:57:44.347 に答える
2

そうしなければならない理由は、ジェネリックがJava に実際には存在しないためです。これは実際にはコンパイラのハックです。

あなたが投稿した2行に関しては、生成されるバイトコードに関して違いはないはずです。ただし、最初のケースでは、型パラメーターが必要であるのを忘れたとコンパイラが判断するため、おそらく警告が表示されますjava.util.ArrayListが、後者は、ジェネリック配列をインスタンス化しようとしているためにコンパイルされません。負け負けの状況:(

于 2010-03-21T18:37:33.180 に答える
1

配列リストの配列リストを作成することもお勧めします。

ArrayList<ArrayList<Type>> alist = new ArrayList<ArrayList<Type>>();

ここで、 Type は、リストを希望するタイプです。これで、配列リストを保持する arraylist ができました。配列リストを追加する場合は、次のようにします。

alist.add(new ArrayList<Type>());
于 2010-03-21T20:08:18.110 に答える
1

あなたがそれを行うことができれば、これは起こります:

ArrayList<String>[] alist = new ArrayList<String>[10];
Object[] olist = alist;   // This is okay because ArrayList is an Object
olist[0] = new ArrayList<Dog>();
olist[0].add(new Dog());
String s = alist[0].get(0);  //Uh oh, Dog is not string
于 2010-03-21T19:41:11.543 に答える