ArrayLists の配列が Java でどのように初期化されるかを理解するのに問題があります。誰かがこのコード行で何が起こっているのか説明できますか?
edges = (ArrayList<Integer>[]) new ArrayList[nodeCount + 1];
ArrayLists の配列が Java でどのように初期化されるかを理解するのに問題があります。誰かがこのコード行で何が起こっているのか説明できますか?
edges = (ArrayList<Integer>[]) new ArrayList[nodeCount + 1];
スペースごとに分割しましょう。
edges
型の変数ですArrayList<Integer>[]
=
は右側を左側に代入する代入演算子です 型
(ArrayList<Integer>[])
への変数のキャストです。未知の要素を持つ
new ArrayList[nodeCount + 1]
の配列にスペースを割り当てることを意味します。ArrayList
nodeCount+1
これは、配列を初期化する非常に悪い方法です。それが行うことは、配列を作成し、要素を整数にすることです。
別の方法:
edges = new ArrayList<Integer>(nodeCount+1);
説明:クラスには、そのArrayList
長さ*を指定できるコンストラクターがあり、これをここで使用します。
注: @Rohit Jain によると、長さは指定されていませんが、初期容量が指定されています。
コンポーネントの型がパラメーター化された型の配列は作成できません。タイプセーフではありません。コンポーネントの型が生の型である配列を作成することはできますが、それも型安全ではありません。次の例を検討してください。
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>>();
おすすめの読み物: -
これは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
オブジェクトは必要に応じて自動的に成長するため、実際には容量パラメーターは単なる最適化です。ただし、必要なエントリ数がすでにわかっている場合は、最初から十分な容量でリストを作成できます。
上記の行では、 の配列を作成しています。たとえば、文字列の配列など、理解しやすいように、より単純な型にArrayList
置き換えることができます。ArrayList
edges = (String[]) new String[nodeCount + 1];
nodeCount + 1
配列のサイズに対応します。配列には、この数を超える要素を含めることはできません。
パラメータ化された配列の使用ArrayList
は非常に奇妙で、誤解やエラーが発生しやすいことに注意してください。ここで使用しList<List<Integer>>
ます。たとえば、次のようになります。
edges = new ArrayList<List<Integer>>();
new ArrayList[nodeCount + 1]
ArrayList の新しい配列を作成します。その長さは nodeCount + 1 です。
それから
(ArrayList<Integer>[])
はキャスト操作です。作成した配列を次の配列にキャストします。ArrayList<Integer>