2

ArrayLists の配列が Java でどのように初期化されるかを理解するのに問題があります。誰かがこのコード行で何が起こっているのか説明できますか?

edges = (ArrayList<Integer>[]) new ArrayList[nodeCount + 1];
4

6 に答える 6

6

スペースごとに分割しましょう。
edges型の変数ですArrayList<Integer>[]
=は右側を左側に代入する代入演算子です 型
(ArrayList<Integer>[])への変数のキャストです。未知の要素を持つ
new ArrayList[nodeCount + 1]の配列にスペースを割り当てることを意味します。ArrayListnodeCount+1

これは、配列を初期化する非常に悪い方法です。それが行うことは、配列を作成し、要素を整数にすることです。

別の方法: edges = new ArrayList<Integer>(nodeCount+1);

説明:クラスには、そのArrayList長さ*を指定できるコンストラクターがあり、これをここで使用します。
注: @Rohit Jain によると、長さは指定されていませんが、初期容量が指定されています。

于 2013-08-09T12:53:13.220 に答える
3

コンポーネントの型がパラメーター化された型の配列は作成できません。タイプセーフではありません。コンポーネントの型が生の型である配列を作成することはできますが、それも型安全ではありません。次の例を検討してください。

List<Integer>[] list = null;       // Declaration is OK
list = new ArrayList<Integer>[5];  // Compiler error: Generic array creation
list = new ArrayList[5];   // Compiles fine. But not safe. Gives warning

生の型の配列を作成したとします。何が意味するのか見てみましょう:

List<Integer>[] list = new ArrayList[10]; // Not type safe

Object[] objArr = list;   // We can assign List<Integer>[] to Object[]

// We can add even ArrayList<String> in Object[]
// This will successfully compile, and run. 
objArr[0] = new ArrayList<String>() {   
    {
        add("rohit"); add("jain");
    }
}; 

// Here's the problem. It will compile fine, but at runtime will throw 
// ClassCastException
Integer val = list[0].get(0);

代替手段は次のListの作成ですList

List<List<Integer>> edges = new ArrayList<List<Integer>>();

おすすめの読み物: -

Angelika Langer の一般的な FAQ :

于 2013-08-09T12:52:23.933 に答える
1

これはArrayList を初期化するのではなく、ArrayLists の配列を初期化します。

  • new ArrayList[nodeCount + 1]=スロットArrayListを持つオブジェクトの配列を作成するnodeCount + 1
  • (ArrayList<Integer>[])ArrayList= 「オブジェクトのみを含む可能性のあるオブジェクトの配列」にキャストしIntegerます。これが必要なのは、Java の配列宣言構文が明らかにジェネリックを処理できないためです (試してみたところ、以前は必要ありませんでした)。

それは誤解である可能性ArrayListがあり、ライターは実際には の容量で1 つを初期化したかったのnodeCount+ 1です。そのための正しいコードは次のようになります

edges = new ArrayList<Integer>(nodeCount + 1);

ArrayListオブジェクトは必要に応じて自動的に成長するため、実際には容量パラメーターは単なる最適化です。ただし、必要なエントリ数がすでにわかっている場合は、最初から十分な容量でリストを作成できます。

于 2013-08-09T13:03:36.380 に答える
1

上記の行では、 の配列を作成しています。たとえば、文字列の配列など、理解しやすいように、より単純な型にArrayList置き換えることができます。ArrayList

edges = (String[]) new String[nodeCount + 1];

nodeCount + 1配列のサイズに対応します。配列には、この数を超える要素を含めることはできません。

パラメータ化された配列の使用ArrayListは非常に奇妙で、誤解やエラーが発生しやすいことに注意してください。ここで使用しList<List<Integer>>ます。たとえば、次のようになります。

edges = new ArrayList<List<Integer>>();
于 2013-08-09T12:54:07.817 に答える
0
new ArrayList[nodeCount + 1] 

ArrayList の新しい配列を作成します。その長さは nodeCount + 1 です。

それから

(ArrayList<Integer>[]) 

はキャスト操作です。作成した配列を次の配列にキャストします。ArrayList<Integer>

于 2013-08-09T12:53:41.220 に答える