在Java中,數組存儲可以存儲對象的原始值(int,char,long,...)或引用類型(也可稱為指針)。
使用“new”創建對象時,會在Heap中分配一個內存空間并返回一個引用。對于數組也是如此,因為數組是Java中的對象。
1. 單維數組
int a1[ ] = new int[3];
int a2[ ] = new int[ ]{3, 6, 7, 4, 9};
int [] a1 只是3個整數數組的引用。如果創建一個包含10個整數的數組,則它是相同的 - 分配一個數組并返回一個引用。
一維數組內存
2. 二維數組
二維數組怎么樣?實際上,我們只能在Java中使用一維數組。二維數組只是一維數組的數組。
int[ ][ ] arr = new int[3][ ];
arr[0] = new int[3];
arr[1] = new int[5];
arr[2] = new int[4];
二維數組內存情況
多維數組與二維數組是同樣的道理。
3. 數組位于Java內存中的哪個位置?
數組也是Java中的對象,因此對象在內存中如何存儲,數組也是一樣的形式,只是數組分配了一個連續的內存,用來存儲相同類型數據。
我們知道JVM運行時數據區包括:Heap(堆),JVM Stacks(JVM棧),Native Method Stacks(本地方法棧)等。對于如下的簡單示例,讓我們看看數組與對象及其引用的存儲位置。
class A {
int x;
int y;
}
...
public void m1() {
int i = 0;
m2();
}
public void m2() {
A a2 = new A();
m3();
}
public void m3() {
int a3[] =
new int[]{3, 6, 7, 4, 9};
m4();
}
public void m4() {
A[] a4[] = new A[3];
}
...
通過上面的聲明,如果,我們調用 m1() 看看會發生什么:
- 當調用m1時,新棧幀(Frame-1)被推入棧,而局部變量i也在Frame-1中創建。
- 然后在m1內調用m2,將另一個新棧幀(Frame-2)推入棧。在m2中,在堆中創建類A的對象,并將引用變量放在 Frame-2 幀中。此時,堆棧和堆如下所示:
執行到方法 m2 內存情況
- 方法 m2 繼續調用 m3,將另一個新棧幀(Frame-3)push 入棧,方法中,創建了 int[ ] 數組,并將引用 a3 返回放在 Frame-3 幀中。
- 方法 m3 繼續調用 m4,新棧幀(Frame-3)推入棧,方法 m4 中,創建了存儲 A 類型的數組:A[ ] a4 = new A[3]; 數組長度為:3;并將引用 a4 返回放在 Frame-4 幀中。此時,堆棧和堆如下所示:
方法調用內存示意圖
數組的處理方式與對象相同,因此數組在內存中的位置是沒有太大的區別。
三言兩語,簡單的說了一說數組,不知讀者是否有所收獲,歡迎留言!
筆者畢竟能力有限,難免有疏漏,如果,大家發現文章有何錯誤,請不吝賜教。謝謝!