簡體   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