Java 數組在內存中的結構


Java中的數組存儲兩類事物: 原始值(int,char,...),或者引用(對象指針).
當一個對象通過 new 創建,那么將在堆內存中分配一段空間,並且返回其引用(指針).
對於數組,也是同樣的方式.
1. 一維數組

[java] view plain copy
  1. int arr[] = new int[3];  

int[] arr 指向 包含3個整數的數組. 假設創建的是包含10個整數的數組,也是同樣的用法 —— 分配指定大小的內存,並返回數組的引用。

圖1

2. 二維數組
二維數組又有什么區別呢?實際上,在Java中只有一維數組。二維數組本質上也是一維數組,只是數組中的每一個元素都指向了另一個一維數組而已。

[java] view plain copy
  1. int[ ][ ] arr = new int[3][ ];  
  2. arr[0] = new int[3];  
  3. arr[1] = new int[5];  
  4. arr[2] = new int[4];  

圖2

同樣的原理,多維數組也是如此.
3. 數組分配在內存的哪個區域?

數組存放在堆中
Java中的數組,也是對象(繼承Object),因此數組所在的區域和對象是一樣的.
我們知道,   JVM 運行時數據區包括 JVM棧,堆內存,以及其他區域. 看下面的關於對象的簡單示例,我們一起來了解數組如何分配,以及引用保存在哪里.

[java] view plain copy
  1. class A {  
  2.     int x;  
  3.     int y;  
  4. }  
  5. ...  
  6. public void m1() {  
  7.     int i = 0;  
  8.     m2();  
  9. }  
  10. public void m2() {  
  11.     A a = new A();  
  12. }  
  13. ...  


上面的代碼片段中,讓我們執行 m1()方法看看發生了什么:

  1.  當 m1 被調用時,一個新的棧幀(Frame-1)被壓入JVM棧中,當然,相關的局部變量也在 Frame-1中創建,比如 i;
  2.  然后 m1調用m2,,又有一個新的棧幀(Frame-2)被壓入到JVM棧中;   m2方法在堆內存中創建了A類的一個對象,此對象的引用保存在 Frame-2的局部變量 a 中. 此時,堆內存和棧內存看起來如下所示:


圖3



而 數組(Array)被當做Object處理,因此數組如何保存的,你應該明白了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM