[英]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.