[JAVA]Java 數組、多維數組,動態、靜態初始化,數組JVM內存模型分析

數組、多維數組,靜態、動態初始化,都說明白了]

什麼是數組

所謂數組,是具有相同數據類型的若干變量或者數據按照一定排序規則組合起來的一種數據存儲格式。數組中的數據稱爲數組元素,我們使用索引來標識數組元素在數組中的存儲位置,索引從0開始,步長是1,其後的索引依次遞增:

數組

其中,數據類型包括以下兩種:

  • 基本數據類byte,short,int,long,float,double,char,boolean
  • 引用數據類型類,接口,數組,基本數據類型的包裝類也數據引用數據類型

Java中數組的定義

數組的定義

  • 方式1:數據類型[] 數組名; 如:int[] ages; 推薦使用此方式創建數組。
  • 方式2:數組元素的類型 數組名[]; int ages[]; 此方法不推薦

數組的初始化

數組必須先初始化,才能使用,也就是要先爲數組和數組元素在JVM內存模型中分配空間,給每個數組元素賦初始值,初始值可以在創建數組時指定,也可以只指定數組長度,然後使用對應數據類型的默認值作爲其初始值,下圖是各個數據類型的默認值:

各個數據類型的默認值

null 表示沒有指向任何存儲空間,是空值;如果將null賦予對象,則表示該對象引用爲空,將會被GC回收,使用此對象調用方法,或者操作數據會觸發NullPointerException(空指針異常)。

初始化數組有兩種方式:靜態初始化動態初始化;但是無論以哪種方式初始化數組,一旦初始化完成,數組的長度就固定了,數組中的元素個數也就已經固定了,不能改變,所以說數組是固定長度的。

**數組的靜態初始化:**由我們(程序員們)來爲每一個數組元素設置初始化值,也就是說知道要在數組中存儲哪些數據;此時數組的長度JVM根據設置的初始值來分配,不需要再設置

語法如下:

數組的靜態初始化

創建數組時,JVM也會爲其分配數據存儲區域;所以,在JVM中創建一個數組時內存模型是這樣的:

靜態初始化數組的JVM內存模型

數組的動態初始化: 由我們(程序員們)來設置數組長度),而數組中元素的初始值由JVM賦予;語法:

數組的動態初始化

但是, 不能同時使用靜態初始化和動態初始化,比如:

int\[\] nums = new int\[3\]{13, 14, 520};  // 這種寫法是錯誤的。

那麼什麼時候使用靜態初始化,什麼時候使用動態初始化呢

  • 如果提前知道需要存儲的數據,優先選用靜態初始化,否則使用動態初始化來創建數組;
  • 知道數組長度時,優先使用動態初始化;
  • 數組長度和需要存儲的數據都知道時,兩種方式都可以,任選其一即可;

動態初始化數組的JVM內存模型

數組的基本操作

1.數組基本操作:

  • 獲取元素: 元素類型 變量 = 數組名[index];
  • 設置元素: 數組名[index] = 值;
  • 數組長度: int len = 數組名.length; 注意這裏的length是屬性,不是方法,從調用上方式上也能看出來;
  • 索引範圍: 從0開始,逐一遞增. 直至 length-1:[0,length-1]
  • 最大值:getMax()
  • 最小值:getMin()

2.操作數組常見異常:

  • NullPointerException:空指針異常,數組或者變量未初始化就直接操作時會觸發;
  • ArrayIndexOutOfBoundsException:數組的索引越界異常,獲取數組元素時使用的索引超出了數組的索引範圍時會觸發。

3.獲取元素在數組中的位置索引:

  • 元素在數組中第一次出現的位置的索引:indexOf()
  • 元素在數組中最後一次出現的位置的索引:lastIndexOf()

數組在main函數中的應用

main函數中的數組


可以接收傳入的參數,一般是提供給用戶傳入參數來完成一些特定的操作的。

多維數組

多維數組:以數組爲數據類型創建數組,也就是數組中的數組,如:二維數組可以這樣來初始化:

靜態初始化

多維數組靜態初始化

動態初始化

多維數組動態初始化

多維數組的取值

int\[1\]\[1\] : 表示第2個一維數組的第2個元素;

創建多維數組時,JVM爲多維數組分配內存;所以,多維數組的內存模型在JVM 中是這樣的:

多維數組的JVM內存模型

  • 一維數組:數組中的每一個元素都是一個值(基本類型或者引用類型)。
  • 二維數組:數組中的每一個元素是一個一維數組。
  • 三維數組:數組中的每一個元素是一個二維數組。

依次類推。

楊輝三角

楊輝三角就是一個典型的多維數組實例:它的規律是每行起始和結束兩個數都是1,每個數都等於它的上方兩個數之和,詳情如下圖所示:

楊輝三角

楊輝三角是二項式係數在三角形中的一種幾何排列,最早出現於北宋賈憲的《黃帝九章算經細草》,後被南宋數學家楊輝抄錄於《詳解九章算法》一書。在Java中可以使用多維數組打印楊輝三角,代碼如下:

楊輝三角的代碼實例

foreach

我們在使用循環迭代數組的時候,有時候並不關心迭代元素的索引,迭代數組元素的時候,直接操作數組元素,不關心操作數組的索引。所以,從Java5開始(JDK1.5)開始,Java提供了一種新的語法,foreach(增強for循環)語法如下:

增強for循環語法

通過foreach,我們便可以快速迭代出數組中的元素:

增強for循環實例

接下來,通過反編譯字節碼文件,看看JVM是如何實現foreach的:

JVM中的增強for循環

不難發現,foreach其實在底層依然是使用for循環+索引來操作數組的,雖然把foreach稱爲增強for循環,但其底層依然是使用for循環實現的,我們將其稱之爲語法糖,目的就是爲了吸引開發者,讓開發者寫更少的代碼,這恰恰也是開發者們樂意願意看到的。

foreach雖然會少些很多代碼,但論性能,靈活性卻不如for循環,所以如果只關心元素而不關心索引,首選foreach,其他情況下還是應該for循環;在集合中也是這樣的道理。

方法的可變參數

Java5還有另一個新特性:方法的可變參數,這裏可變說的是參數的個數可變,並不是參數值可變,看如下的代碼中,方法getArgsLength便使用了可變參數:

可變參數實例

還是將其反編譯,查看JVM對可變參數的實現;不難發現,方法的可變參數其實也是一個語法糖,因爲其底層還是一個數組,因此,可以把可變參數類型當做一個數組來處理,比如元素輸出:

可變參數的JVM實現

可變參數的使用注意

  1. 可變參數必須作爲方法的最後一個參數,避免與其他參數產生歧義,引發異常;
  2. 方法最多隻能有一個可變參數。

完結。老夫雖不正經,但老夫一身的才華

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章