三言兩語@ Java 數組

在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() 看看會發生什么:

  1. 當調用m1時,新棧幀(Frame-1)被推入棧,而局部變量i也在Frame-1中創建。
  2. 然后在m1內調用m2,將另一個新棧幀(Frame-2)推入棧。在m2中,在堆中創建類A的對象,并將引用變量放在 Frame-2 幀中。此時,堆棧和堆如下所示:
執行到方法 m2 內存情況
  1. 方法 m2 繼續調用 m3,將另一個新棧幀(Frame-3)push 入棧,方法中,創建了 int[ ] 數組,并將引用 a3 返回放在 Frame-3 幀中。
  2. 方法 m3 繼續調用 m4,新棧幀(Frame-3)推入棧,方法 m4 中,創建了存儲 A 類型的數組:A[ ] a4 = new A[3]; 數組長度為:3;并將引用 a4 返回放在 Frame-4 幀中。此時,堆棧和堆如下所示:
方法調用內存示意圖

數組的處理方式與對象相同,因此數組在內存中的位置是沒有太大的區別。
三言兩語,簡單的說了一說數組,不知讀者是否有所收獲,歡迎留言!

筆者畢竟能力有限,難免有疏漏,如果,大家發現文章有何錯誤,請不吝賜教。謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容