我們已經了解了數組,它是一種引用類型,本篇將詳細介紹數組的內存分配等知識點。數組用來存儲同一種數據類型的數據,一旦初始化完成,即所占的空間就已固定下來,即使某個元素被清空,但其所在空間仍然保留,因此數組長度將不能被改變。當僅定義一個數組變量(int[] numbers)時,該變量還未指向任何有效的內存,因此不能指定數組的長度,只有對數組進行初始化(為數組元素分配內存空間)後才可以使用。數組初始化分為靜態初始化(在定義時就指定數組元素的值,此時不能指定數組長度)和動態初始化(只指定數組長度,由系統分配初始值)。
//靜態初始化 int[] numbers = new int[] { 3, 5, 12, 8, 7 }; String[] names = { "Miracle", "Miracle He" };//使用靜態初始化的簡化形式
//動態初始化 int[] numbers = new int[5]; String[] names = new String[2];
建議不要混用靜態初始化和動態初始化,即不要既指定數組的長度的同時又指定每個元素的值。當初始化完畢後,就可以按索引位置(0~array.length-1)來訪問數組元素了。當使用動態初始化時,如在對應的索引位未指定值的話,系統將指定相應數據類型對應的默認值(整數為0,浮點數為0.0,字符為'\u0000',布爾類型為false,引用類型為null)。
public class TestArray { public static void main(String[] args) { String[] names = new String[3]; names[0] = "Miracle"; names[1] = "Miracle He"; //以下代碼將輸出Miracle Miracle He null //還可以使用foreach來遍歷 for(String name : names) { System.out.print(name + " "); } } }
請注意:java中是沒有foreach這個關鍵字的,其語法是for(type item : items)來表示,但foreach只能用於遍歷元素的值而不能改變,必須使用for才能實現。
public class TestForEach {
public static void main(String[] args) {
int[] numbers = { 3, 5, 12, 8, 7 };
for(int number : numbers) {
int num = number * 10;
System.out.print(num + ",");
}
System.out.println("");
//numbers仍然未發生變化(如果換成for將改變)
for(int i = 0;i < numbers.length;i++) {
System.out.print(numbers[i] + ",");
}
}
}
以上簡單的介紹了數組的初始化和應用,接下來講詳細介紹數組(數組引用和數組元素)在內存中的存放形式。首先給出結論:數組引用變量是存放在棧內存(stack)中,數組元素是存放在堆內存(heap)中,通過棧內存中的指針指向對應元素的在堆內存中的位置來實現訪問,以下圖來說明數組此時的存放形式。