噹噹買的新書今天到了,叫《瘋狂Java突破程式員基本功的16課》。我記得羅永浩好像說過什麼打著幾天速成/瘋狂/輕鬆之類旗號的都不靠譜,其實我也是抱著不靠譜的心態買的這書。但是今天到手後看來……還是那個事,比較適合我這種基本功薄弱的菜鳥。雖說我做了快3年的Java,但是說實話我根本就沒有學過Java,現在用的所有開發技巧都是早年學C語言時學的(現在C語言壓根就不會了。。。)。所以這本書比較補內功心法,推薦跟我一樣Java入門的菜鳥看看。
Java的數組跟對象類似,屬於參考型別的變數。
Java語言是典型的靜態語言,因此Java的數組是靜態,即當數組被初始化後該數組的長度不可改變。
初始化數組的方式有兩種:靜態初始化/動態初始化。
靜態初始化:
String[] books = new String[]{ "a", "b"}String[] names = { "c", "d"}
動態初始化:
String[] strArr = new String[5];
OK,Java數組就講到這裡,下面講講數組的記憶體配置。
再講記憶體配置之前先介紹四個關鍵字:
棧記憶體、堆記憶體、變數、對象
這裡最關鍵的就是變數與對象的區別,我們看一個例子:People p =
new People();這裡紅色的就是變數,而藍色的就是對象。
下面我們來分析一下基本類型數組的初始化過程:
int [] iArr;iArr = new int[]{2, 5};
1.在main棧記憶體申請iArr空間;
2.在堆記憶體中申請int型2和5的連續空間;
3.將連續空間的地址值賦給棧記憶體中的iArr。
下面我們再來分析一下參考型別數組的初始化過程:
Person[] students;students = new Person[2];Person p1 = new Person();Person P2 = new Person();students[0] = p1;students[1] = p2;
1.在main棧記憶體申請students空間;
2.在堆記憶體中申請2個連續空間;
3.在main棧記憶體中申請p1空間;
4.在堆記憶體中申請p1對象空間,並把地址值給棧記憶體中的p1;
5.在main棧記憶體中申請p2空間;
6.在堆記憶體中申請p2對象空間,並把地址值給棧記憶體中的p2;
7.將p1對象的地址值給堆記憶體中的students[0];
8.將p2對象的地址值給堆記憶體中的students[1]。
===============================================================================================
有些書籍這樣描述:
基本類型變數的值儲存在棧記憶體中。(這句話是錯誤的,例子中基礎資料型別 (Elementary Data Type)的值2、5都是存放在堆記憶體裡的)
正確的描述應為:
所有局部變數都是放在棧記憶體裡儲存的,不管其是基礎資料型別 (Elementary Data Type)變數還是參考型別的變數,都是儲存在各自的方法棧地區中;但參考型別變數所引用的對象(包括數組、普通Java對象)則總是儲存在堆記憶體中。
請看下面這個例子:
int k = 5;//k在棧記憶體中,儲存的值是5,也就說5在棧記憶體中
People p = new People();//p在棧記憶體中,儲存的值是new People()的地址值,new People()在堆記憶體中
int[] s = {5};//s在棧記憶體中,儲存的值是{5}的地址值,{5}在堆記憶體中,也就說5在堆記憶體中。
這裡還引出了一個概念就是:
int[] iArr = new int[5];
int n;
n與iArr[x]都是變數。
本節的重點:
1.Java數組的基本文法;
2.數組的靜態特性;
3.數組的記憶體配置機制;
4.初始化Java數組的兩種方式;
5.數組引用變數和數組對象;
6.數組元素等同於變數。