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

ArrayList的ArrayList类似于java中的2D数组吗?,java,arrays,arraylist,multidimensional-array,Java,Arrays,Arraylist,Multidimensional Array,是一个 ArrayList编号类似于整数的2D数组int[][]数字? 或者这些存储完全不同吗?它类似于Integer[][],这与int[][]有些不同 另外,ArrayList还提供了额外的功能,例如动态增长的能力,以及管理大小和容量的独立概念。不完全确定,但在这两种情况下,内存分配将不同。基本数组int[][]将在堆栈中分配,而ArrayList将在堆中分配它是一个二维结构,因此类似于[][],但是有一个非常重要的区别:如果您在一个步骤中分配一个二维数组,那么对于第一维度的所有元素,您将在

是一个
ArrayList编号类似于整数的2D数组
int[][]数字
或者这些存储完全不同吗?

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


另外,
ArrayList
还提供了额外的功能,例如动态增长的能力,以及管理大小和容量的独立概念。

不完全确定,但在这两种情况下,内存分配将不同。基本数组
int[][]
将在堆栈中分配,而
ArrayList
将在堆中分配

它是一个二维结构,因此类似于[][],但是有一个非常重要的区别:如果您在一个步骤中分配一个二维数组,那么对于第一维度的所有元素,您将在第二维度中获得相同大小的

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

for (int[] second : arrayOfInts) {
   System.out.println(second.length);
}
ArrayList<ArrayList<Integer>> arrayOfArrays = new ArrayList<ArrayList<Integer>>();
for (int i=0; i < 5; i++) {
    arrayOfArrays.add(new ArrayList<Integer>();
}
打印5次“4”

使用ArrayList of ArrayList,第二维度的所有元素都可能具有不同的大小

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

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

for (int i=0; i<5; i++) {
  anotherArray[i] = new int[i];
}
另一个区别是:在分配int[x][y]之后,两个维度中所有元素的内存都从第一刻开始分配。在ArrayList of ArrayList中,会分配列表所需的内存,但在创建其内容之前,不会使用其元素所需的内存。因此,与前面类似的代码将不打印任何内容,因为在开始时,第一个ArrayList中甚至没有一个元素

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

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

for (int[] second : arrayOfInts) {
   System.out.println(second.length);
}
ArrayList<ArrayList<Integer>> arrayOfArrays = new ArrayList<ArrayList<Integer>>();
for (int i=0; i < 5; i++) {
    arrayOfArrays.add(new ArrayList<Integer>();
}
打印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));
ArrayList arrayOfArrays=new ArrayList();
对于(int i=0;i<5;i++){
添加(新的ArrayList();
}
System.out.println(first.get(2.get(3));
抛出ArrayOutOfBoundsException。在访问元素之前,必须检查元素的大小


现在int[][]和Integer[][]之间还有一个重要的区别:基本类型总是有值,所以在分配int[4][5]之后,单位化元素的0。Integer[4][5]包含对象,因此单元化元素将改为null

除了第一个元素可以动态增长外,两个元素都是相似的。这两个元素在内存分配方面都不同您还可以使用
int[]
在第二维度中具有不同的大小。当使用
int[]访问第二维度中未初始化的元素时,您将获得NPE
。第一个:如果动态创建第二个维度,则为true。第二个:不为true,所有基元类型都立即有值。如果int为0,则我将适当地编辑答案。要证明我的第二个观点,请尝试以下操作:
int[][]a=new int[3][];a[1][1]=7;
我收回我的反对意见-你是对的,谢谢你指出。为我辩护:内容和示例使用了使用[x][y]的即时分配在这种情况下,两个维度都是相同的,访问是安全的,不会出现越界和空指针异常。然而,为了使答案有用和完整,需要考虑您的意见,我已经考虑过了:在应该致敬的地方向您致敬。