繁体   English   中英

ArrayList的ArrayList是否类似于java中的2D数组?

[英]Is ArrayList of ArrayList similar to a 2D array in java?

ArrayList<ArrayList<Integer>> numbers; int[][] numbers;的二维数组int[][] numbers; 或者这些存储完全不同?

它是一个具有两个维度的结构,因此它是[] [] - 但是有一个非常重要的区别:如果你在一个步骤中分配一个二维数组,你将在第二个维度中为所有元素获得相同的大小第一个维度:

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

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

打印5次“4”。

使用ArrayLists的ArrayList,第二维的所有元素可以具有不同的大小。

正如jlordo所指出的那样:如果动态创建,则int数组也可能具有不同长度的第二维:

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

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

在这种情况下,如果在初始化之前访问第二个维度,则可以抛出NullPointerException,如:

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

另一个区别是:在分配int [x] [y]之后,两个维度中所有元素的内存从第一刻开始分配。 在ArrayLists的ArrayList中,将分配列表所需的内存,但不会在创建内容之前使用其元素所需的内存。 因此,与之前类似的代码将不会打印任何内容 ,因为在开始时,第一个ArrayList中甚至不会有单个元素。

要获得第二个维度,首先必须创建第二个维度的所有ArrayLists:

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 [] []之间也有一个重要的区别:原始类型总是有值,所以在分配int [4] [5]之后,对于单元化元素你将得到0 整数[4] [5]包含对象,因此单元化元素将为null

它类似于Integer[][] ,它与int[][]有些不同。

此外, ArrayList还提供了与阵列相关的额外功能,例如动态增长的能力,以及管理大小容量的单独概念。

不完全确定,但两种情况下的内存分配都不同 原始数组int[][]将在堆栈中分配,而ArrayList<ArrayList<Integer>>将在Heap中分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM