1. 程式人生 > >陣列深入:陣列與記憶體控制

陣列深入:陣列與記憶體控制

面試時你是否被問到這樣一些問題:

  • 在java中,宣告一個數組的過程中,是如何分配記憶體的?
  • java中陣列的初始化有哪幾種方式?
  • 基本資料型別陣列和引用型別陣列之間有什麼區別,在初始化時的記憶體分配機制有什麼區別嗎?

1.1 陣列的初始化:

1.11 java語言是典型的靜態語言,因此java的陣列是靜態的,即當陣列被初始化之後,該陣列的長度是不可變的。java陣列經過初始化之後才可使用。所謂初始化,就是為陣列物件的元素分配記憶體空間,併為每個資料元素指定初始值。

靜態初始化:初始化時由程式設計師指定每個資料元素的初始值,由系統決定陣列長度。

動態初始化:初始化時程式設計師只指定資料的長度,由系統為陣列元素分配處世之

陣列元素是byte,short,int,long,則資料元素的值預設為0,

陣列元素是float,double,則資料元素的值預設為0.0,陣列元素是char,則資料元素的值預設為\u0000,

陣列元素是boolean,則資料元素的值預設為flase,

陣列元素是引用型別,則資料元素的值預設為null

		//靜態初始化
		String[] names={"liu","zhang","zhou","wu"};
		//動態初始化
		String[] str=new String[5];

注:1.不要同時使用靜態初始化和動態初始化。即不要在陣列進行初始化時,既指定陣列長度,又為每個陣列元素分配初始值。

2.java陣列變了陣列變數是一種引用型別的變數,陣列變數不是陣列物件本身,他儲存在棧記憶體中,只是指向(引用)堆記憶體中的陣列物件

3.java陣列是靜態的,一旦初始化成功,陣列元素的記憶體空間分配即結束,程式只能改變陣列物件元素的值,而不能改變陣列的長度。

1.12 陣列一定要初始化嗎?

始終記住:java的陣列變數是引用型別的變數,他並不是陣列物件本身,只是讓陣列指向有效的陣列物件。它們都不需要經過所謂的初始化,需要進行初始化的是該引用變數所引用的物件。

1.1.3 基本型別陣列的初始化

對基本型別陣列而言,陣列元素的值直接儲存在對應的陣列元素中,因為基本資料型別的初始化比較簡單,程式直接為陣列元素分配記憶體空間,再將陣列元素的值存入相應的記憶體中。

		String[] names;
		names=new String[]{"liu","zhang","zhou","wu"};
靜態初始化後,系統會根據程式設計師指定的陣列元素來決定陣列的長度。一旦該陣列建立成功,該陣列的長度則不會改變。

1.1.4 引用型別陣列的初始化

引用陣列型別的陣列元素依然是引用型別的,因此陣列元素裡儲存的還是引用,他指向另一塊記憶體,這塊記憶體裡儲存裡該引用變數所引用的物件(陣列或java物件)

1.2 使用陣列

當陣列引用變數指向一個有效的陣列物件之後,程式就可以通過該陣列引用變數來訪問陣列物件。java語言不允許直接訪問堆記憶體中的資料,因此無法直接訪問堆記憶體中的陣列物件,程式將通過陣列引用變數來訪問陣列。

1.2.1 陣列元素是變數

當程式需要多個型別相同的變數來儲存程式狀態時,可以考慮使用陣列來儲存這些變數。當一個數組初始化完成後,就相當於叮一口多個型別相同的變數。

1.2.2 沒有多維陣列

多維陣列都可以當成一位陣列來處理。