Java數組基本功(動態初始化、靜態初始化)


——瘋狂Java讀書筆記

3個問題:

①java中,聲明一個數組的過程中是如何分配內存的

②Java數組的初始化一共有哪幾種方式

③基本數據類型數組和引用類型數組之間,初始化時內存分配機制有什么區別

一.java的初始化

java數組是靜態的,必須經過初始化后才能使用,並且一旦初始化指定了數組的長度,該長度是不可變的。

兩種初始化的方式:

1.靜態初始化:初始化時由程序猿顯示指定每個數組元素的初始值,由系統決定數組的長度

舉個栗子:

String[] names = new String[]{"孫猴子","唐僧","豬八戒"};

2.動態初始化:就是與靜態初始化相對的撒,23333。其實動態初始化就是在初始化的時候指定數組長度(這時已經分配內存)
舉個栗子:

String[] names = new String[3]; names[0]="孫猴子"; names[1]="唐僧"; names[2]="豬八戒";

但是初始化只有這兩種方式嗎?我們需要理解到真正的初始化到底做了什么工作。
先了解一下初始化后它在內存中是這個樣子的。


初始化后的內存示意圖.png

提示:所有的局部變量都是放在棧內存中保存的,不管其實基本類型的變量還是引用類型的變量,都是存儲在各自的方法棧區中;但引用類型變量所引用的對象(包括數據,普通java對象)則總是存儲在堆內存中。

Java中數組是引用變量(類似於C語言中的指針變量),我們初始化操作后,就是將它的引用指向了堆內存中開辟的指定長度的連續內存空間。
所以我們真正所做的初始化是將棧中數組變量指向有效的內存。

這樣初始化也是完全可以的。

String[] names = new String[3]; names[0]="孫猴子"; names[1]="唐僧"; names[2]="豬八戒"; String[] names2; names2 = names;

對於java中的所有引用變量,它們都不需要經過所謂的初始化操作,需要進行初始化操作的是該應用變量所引用的對象。比如,數組變量不需要進行初始化操作,而數組對象本身需要初始化;對象的引用變量也不需要初始化,而對象本身才需要進行初始化

基本類型的初始化

兩個步驟:
①程序直接先為數組分配內存空間
②再將數組元素的值存入對於的內存中

int iArr[]; iArr = new int[]{1,2,3};

基本數據類型初始化后再內存中的存儲形式.png

引用類型的初始化

引用類型數組中的元素仍然是引用類型,因此數組元素里存儲的還是引用,它指向另一塊內存。

public static void main(String[] args){ People[] peoples = new People[2]; People people1 = new People(); people1.name = "小明"; People people2 = new People(); people2.name = "小紅"; people[0] = people1; people[1] = people2; } public static class People{ public String name; }

下面對應內存中的分配流程:


peoples數組初始化

兩個對象初始化完成

為數組元素賦值后

從上圖我們可以看到,people1與people[0]、people2與people[1]指向的是同一內存區(堆內存)的。(這里與java中的值傳遞有關系)



文/昨天還是一個小白(簡書作者)
原文鏈接:http://www.jianshu.com/p/73971b5b16da
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。


免責聲明!

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



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