1. 程式人生 > >Java---陣列與陣列的記憶體分配

Java---陣列與陣列的記憶體分配

1.辨析陣列變數和陣列物件

程式碼示例:

int[] a;     //#1
a = new int[2];   //#2

上面一小段程式碼展示了什麼是陣列變數,什麼是陣列物件。在#1中聲明瞭一個數組型別的變數a,這個時候a並未指向任何一段記憶體,編譯器也為替a分配記憶體,這個a是未初始化的,在這裡a就是一個數組變數。
陣列變數是陣列變數是一種引用型別的變數,陣列變數並不是陣列本身,它只是指向堆記憶體中的陣列物件,
而在#2中,通過new建立了一個長度為2的陣列物件,並用a指向了這個物件。

2.陣列的初始化

程式碼示例:

int[] a = new
int[]{1,2,3,4,5}; //靜態初始化 int[] b = new int[5]; //動態初始化

.靜態初始化:初始化時由程式設計師顯示地指定陣列中每個元素的,由系統決定陣列長度
動態初始化:初始化時只指定陣列的長度,由系統為陣列元素分配初始值

3.多維陣列?

多維陣列的概念並不鮮見,但是我們一般見到的多維陣列就像一個規規矩矩的矩陣一樣,有固定的行數,固定的列數,但是在java中,多維陣列變的有點不一樣了。先看一段程式碼:

//把a當做1維陣列進行初始化,初始化為一個長度為4的陣列
//a陣列的陣列元素型別為引用型別
a = new int
[4][]; //把a當做一個一維陣列,遍歷a陣列的每個陣列元素 for(int i = 0;i < a.length; i++){ System.out.println("a["+i+"]: "+ a[i]); } //初始化a陣列的第一個元素 a[0] = new int[2]; //初始化a陣列的第二個元素 a[1] = new int[3]; //訪問a陣列的第一個元素所指陣列的第二個元素 a[0][1] = 6; //訪問a陣列的第二個元素所指陣列的第二個元素 a[1][1] = 6; //a陣列的第一個元素是一個一維陣列,遍歷這個陣列 for(int i = 0;i < a[0].length;i++) { System.out
.println("a[0]["+i+"]: "+a[0][i]); } //a陣列的第二個元素是一個一維陣列,遍歷這個陣列 for(int i = 0;i < a[1].length;i++) { System.out.println("a[1]["+i+"]: "+a[1][i]); }

根據以上對陣列變數以及陣列物件的辨析來理解來理解以上的程式碼。
首先定義了一個數組變數a,指向了一個長度為4的陣列物件,這個陣列物件的元素型別是一維陣列型別。先把a看做一個一維陣列,那麼a的每一個元素都是一個數組變數,都可以指向一個數組物件,也就是說一維陣列a中的元素型別是一維陣列即可,那麼也就不必強求陣列a中的元素都是長度相等的一維陣列。
綜上可以看出,在java中,一個二維陣列可以看作是一個儲存一維陣列的陣列,所儲存的一維陣列長度可以不同。

4.陣列的記憶體分配

在java中,所有區域性變數都存放在棧記憶體中,不管是基本型別的變數還是引用型別的變數,都是儲存在各自的方法棧區中。但引用型別所引用的物件則存放在堆記憶體中,堆記憶體中物件通常不允許直接訪問,為了訪問堆記憶體中的物件,通常只能通過引用變數。
則陣列變數一般都存放在棧中,而這個陣列變數所指向的陣列物件則存放在堆記憶體中,從這我們可以看到陣列變數有點類似於指標。