Java基礎篇——數組詳解

項目開發中,若是須要存儲大量的數據,例如若是須要讀取100個數,那麼就須要定義100個變量,顯然重複寫100次代碼,是沒有太大意義的。Java語言提供了數組(array)的數據結構,能夠解決這個問題。數組


數組的概念

一個數組是相同數據類型的元素按必定順序排列的集合。使用數組能夠將同一類型的數據存儲在連續的內存位置。數組中各元素的類型相同,經過下標的方式來訪問數組中的元素,下標從0開始。微信

由此得出,數組具備如下基本特色:數據結構

  • 數組的長度是肯定的,數組一旦被建立,它的大小就是不能夠改變的。架構

  • 數組的元素必須是相同類型,不能出現混合類型。app

  • 數組類型能夠是任意數據類型,包括基本數據類型和引用類型。spa

數組在使用以前必須先聲明,也就是要先定義後使用。一維數組的定義格式爲:.net

  • 數據類型[] 數組名;3d

  • 數據類型 數組名[];orm

這兩種聲明方式徹底等價,不過在實際開發中,咱們通常推薦使用第一種方式。對象

數組的初始化

數組聲明以後,僅僅是定義了一個數組引用,系統並無爲數組分配任何內存,所以如今還不能訪問它的任何元素。必須通過數組初始化後,才能使用數組的元素。

數組的初始化分爲靜態初始化和動態初始化兩種。

  • 靜態初始化就是在定義數組的同時給數組元素賦值。靜態初始化使用一對大括號將初值括起來,大括號中元素的個數就是數組的長度。

格式:數據類型[] 數組名 = new 數據類型[]{元素1,元素2,…};

例如:int[] arr = new int[]{1,2,3,4};

  • 動態初始化就是在定義數組時,只指定數組的長度,不爲它賦值。在使用到的時候在給它添加元素。

格式:數據類型[] 數組名 = new 數據類型[數組長度];

例如:

int[] arr = new int[4];

arr[0] = 1;

arr[1] = 2;

arr[2] = 3;

arr[3] = 4


數組內存圖解

首先咱們要先了解Java中堆和棧的概念。咱們能夠這樣理解:

咱們定義的局部變量都存儲在棧中;而堆中存放的都是數組和對象(其實數組也是對象)。凡是new創建的都是在堆中,堆中存放的都是實體(對象),實體能夠有多個屬性,若是一個數據消失,這個實體沒有消失,還能夠用,因此堆是不會釋放的;可是棧不同,棧裏存放的都是單個變量,變量被釋放了,那就沒有了。

下面,咱們經過對一個數組的聲明和初始化的例子來看內存的分配狀況。

1.聲明一個數組

int[] s = null;

這時,只是聲明瞭一個數組變量,這個變量存儲在棧中,堆內存中是不會發生變化的:


2.給數組分配空間

s = new int[10];

當給數組分配空間之後,纔會在堆內存中給數組真的分配空間,而且變量 s 會指向數組在堆內存中的地址:


3.給數組元素賦值

for(int i = 0;i < 10; i++) {

    s[i] = i + 1;

}



遍歷數組

遍歷數組有兩種方式:

  • 普通 for 循環

for(int i = 數組第一個元素的下標; i < 數組名.length; i++){

    System.out.println(數組名[i]); // 輸出下標爲 i 的元素值

}


數組中的元素個數 length 是數組類中惟一的數據成員變量,使用 new 建立數組時系統自動給 length 賦值。數組一旦建立完畢,其大小就固定下來了。

  • 加強 for 循環(JDK 1.5以後可用)

for(數組中元素的數據類型 變量名 :數組名){

    System.out.println(變量名); // 輸出元素值

}


多維數組

數組元素能夠聲明爲任何類型,當數組的類型是一個一維數組類型時,這樣能夠創建數組的數組,即二維數組。同理,能夠獲得多維數組。通常來說,n 維數組 n-1 維數組的數組。聲明多維數組時使用類型及多對方括號。以二維數組爲例,定義格式以下:

類型[][] 數組名;

也可使用以下兩種方式聲明一個二維數組:

類型[] 數組名[];

類型 數組名[][];

推薦使用第一種。例如:int[][] arr; 就表示一個二維數組。

多維數組的初始化

與一維數組同樣,多維數組的初始化也分爲靜態和動態兩種。

靜態初始化時,在定義數組的同時爲數組元素賦值。例如,二維數組 arr 的初始化以下:

int[][] arr = {{1,2}, {2,6}, {7,9}};

這裏,沒必要指出數組每一維的大小,系統會根據初始化時給出的初值的個數自動計算數組每一維的大小。外層括號所包含各元素是數組第一維的各元素,內層括號對應於數組第二維的元素

對二維數組進行動態初始化時,有兩種分配內存空間的方法:直接分配與按維分配。

  • 直接分配就是直接爲每一維分配空間,聲明數組時,給出各維的大小。以二維數組爲例,定義格式以下:

類型[][] 數組名 = new 類型[第一維數組的長度][第二維數組的長度];

例如:

int[][] arr = new int[2][3]; 

聲明瞭一個2行3列的二維數組。

  • 按維分配是從最高維起,分別爲每一維分配內存。

建立二維數組的通常格式爲:

類型[][] 數組名 = new 類型[第一維數組的長度][];

數組名[0] = new 類型[第二維數組的長度];

數組名[1] = new 類型[第二維數組的長度];

……


若是建立數組時第二維大小是同樣的,則建立的是一個矩陣數組。

多維數組的訪問

在定義並初始化多維數組後,可使用多維數組中的每一個元素。仍以二維數組爲例,訪問方式爲:

數組名[第一維下標][第二維下標];

數組下標都是從 0 開始,第一維也稱爲行,第二維也稱爲列。


二維數組也有length屬性,但它只表示第一維數組的長度。例如:

int[][] a = new int[3][4];

a.length 的值就是 3,a[0].length 的值就是 4。

緣由以下:


點個關注吧,我會持續更新更多幹貨~~


本文分享自微信公衆號 - Java架構成長之路(K469785635)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索