3

ArrayList<ArrayList<Integer>> numbers;int の 2D 配列のようなものです int[][] numbers;か? それとも、これらは互いに完全に異なって保存されていますか?

4

3 に答える 3

7

これは 2 次元の構造であるため [][] に似ていますが、非常に重要な違いが 1 つあります。1 つのステップで 2 次元配列を割り当てると、すべての要素に対して 2 番目の次元で同じサイズが得られます。最初の次元の:

int[][] arrayOfInts = new int[5][4];

for (int[] second : arrayOfInts) {
   System.out.println(second.length);
}

「4」を5回出力します。

ArrayLists の ArrayList を使用すると、2 番目の次元のすべての要素のサイズが異なる場合があります。

jlordo が指摘したように: int の配列は、動的に作成された場合、異なる長さの 2 番目の次元を持つこともあります。

int[][] anotherArray = new int[5][];

for (int i=0; i<5; i++) {
  anotherArray[i] = new int[i];
}

この場合、次のように、2 番目の次元が初期化される前にアクセスされた場合、NullPointerException がスローされる可能性があります。

int[][] yetAnotherArray = new int[5][];
System.out.println(yetAnotherArray[2][3]);

その他の違い: int[x][y] を割り当てた後、両方の次元のすべての要素のメモリが最初の瞬間から割り当てられます。ArrayLists の ArrayList では、リストに必要なメモリが割り当てられますが、その要素に必要なメモリは、コンテンツを作成する前ではなく使用されます。したがって、最初の ArrayList には要素が 1 つも含まれていないため、前と同様のコードでは何も出力されません。

2 番目の次元を作成するには、まず 2 番目の次元のすべての ArrayList を作成する必要があります。

ArrayList<ArrayList<Integer>> arrayOfArrays = new ArrayList<ArrayList<Integer>>();
for (int i=0; i < 5; i++) {
    arrayOfArrays.add(new ArrayList<Integer>();
}

さらにアクセス側で:

int[][] arrayOfInts = new int[5][4];
System.out.println(arrayOfInts[2][3]);

すべてのメモリがすでに割り当てられているため、0 が出力されます。プリミティブ型であるため、次元とその値のアドレス指定の両方でアクセスは安全です。

ArrayList<ArrayList<Integer>> arrayOfArrays = new ArrayList<ArrayList<Integer>>();
for (int i=0; i < 5; i++) {
    arrayOfArrays.add(new ArrayList<Integer>();
}
System.out.println(first.get(2).get(3));

ArrayOutOfBoundsException をスローします。要素にアクセスする前に、要素のサイズを確認する必要があります。

int[][] と Integer[][] の間にも重要な違いが 1 つあります。プリミティブ型には常に値があるため、int[4][5] を割り当てた後は、ユニット化された要素に0が割り当てられます。Integer[4][5] にはオブジェクトが含まれているため、初期化された要素には代わりにnullが含まれます。

于 2012-11-30T08:12:23.203 に答える
3

に似ていますがInteger[][]、 とは多少異なりint[][]ます。

またArrayList、動的に拡張する機能や、サイズ容量の個別の概念を管理する機能など、配列の機能に対する追加機能も提供します。

于 2012-11-30T08:03:07.093 に答える
1

完全にはわかりませんが、どちらの場合もメモリ割り当ては異なります。プリミティブ配列int[][]スタックArrayList<ArrayList<Integer>>割り当てられ、ヒープに割り当てられます。

于 2012-11-30T08:12:06.463 に答える