[Java入門筆記] Java語言基礎(五):數組,入門java
簡介
數組可用用於儲存儲存多個資料,Java的數組要求所有的數組元素具有一種相同的資料類型。一旦數組初始化完成,數組在記憶體中的空間被固定下來,長度不可改變,即使把數組的元素清空,所佔用的空間依然被保留。
生活案例:博物架每一個物品架都是相同類型的物品,長度不變,即使把物品下架,物品架依然不會改變。 定義數組
使用數組4步走:
1、聲明數組Java中支援兩種格式的數組定義格式:
類型[] 變數名;類型 變數名[];
例:
int[] a;int b[]; //兩種方法都行,不過建議使用第一種。
聲明數組也就相當於上面例子中購買了一個定製的物品架(數組)到博物館中,但是還沒有確定物品架的大小(數組的大小),也還沒有往物品架上放東西(數組元素)。
2、分配空間 分配空間也就是對數組進行初始化,初始化分為兩種方式:第一種:靜態初始化靜態初始化的文法格式如下:
資料類型[] 變數名 = new 資料類型[]{資料1, 資料2,資料3,......};
例:
int[] a = new int[]{4,2,64,12,3}; //將這些數存放在數組中,數組的大小(長度)為花括弧中元素的數量,該例子中大小為5String[] b = new String[]{"張三", "李四", "王五"}; //所有資料的類型必須為定義的資料類型int[] c = {2,5,7}; //也可以使用這樣的簡寫方式
這就如同購買一個定製的物品架回來,同時將展示品放到物品架中一起購買回來,而物品架的大小就有多少物品就就有多大。第二種:動態初始化
動態初始化是只指定數組的大小,由系統為每個元素指定初始值得一種方式。文法格式如下:
資料類型[] 變數名 = new 資料類型[大小];
在這個格式中, 需要為其指定一個整數類型的數組大小,指定後,將確定資料的長度,數組能夠存放多少元素。同時為所有元素指定一個預設初始值。
例:
int[] a = new int[5]; //定義一個數組,長度為5,也就是說,能夠存放5個int類型的資料,同時,預設5個值初始化為0
初始化時預設值按以下規定設定:
- byte,short,int、long預設為0;
- float、double預設為0.0;
- char預設為'\u0000';
- boolean預設為false;
- 其他參考型別預設為null;
3、賦值 儘管你已經初始化好了數組,但是我們還是可以通過通過賦值的方式改變裡面的資料。那麼已經初始化好了數組,確定了數組的大小,我們該如何為沒一個數組元素賦值呢?數組中還有一個下標的概念,數組初始化的時候,會為每個元素分配一個下標,就和物品展示架上的編號一樣,我們可以通過下標為每個元素重新賦值。數組的下標從0開始,也就是說,第一個元素的下標為0,至於為什麼要從0開始,我們後面再探討一下,我們先看看賦值的例子:
int[] a = new int[3]; //定義一個長度為3的int類型數組,裡面3個元素值已預設為0;a[0] = 4; //設定第一個元素值為4a[1] = 5; //設定第二個元素值為5a[2] = 7; //設定第三個元素值為7
為什麼數組下標從0開始?
首先我們需要知道的是,程式是在電腦記憶體中啟動並執行,當我們的程式開始處理資料時,會在記憶體中開闢一個小小的空間用來儲存資料,在代碼中也就是定義一個變數,如:
int a = 5;
定義一個int類型變數,值為五,而在記憶體中表示為,在記憶體中分配一小塊記憶體,命名為a,裡面存的值為5。
而我們是如通過a這樣一個變數名得到記憶體中的值得呢?是因為每一小塊記憶體都會有一個地址,就如同我們居住的家有一個地址一樣,通過這個地址,通過這個地址,就能知道裡面住的是誰。
二數組在記憶體中是以相連的位置儲存的,方便對數組的操作,我們看一個例子:
int[] b = new int[3]; //定義一個int類型的數組,長度為3,裡面的元素預設值為0
此時記憶體中是這樣的:
數組中獲得資料也是如此,如何知道b數組每個元素的資料呢?首先我們知道通過b這個數組在記憶體中的哪個位置,因為數組在記憶體中是一個相連的記憶體空間,所以b[0]的位置就等於b+0,而b[1]的位置就為b+1,b[2]=b+2,......以此類推,知道了數組所有元素的位置。而數組中第一個元素正好是在數組中開頭的位置,用b[0]表示,則剛好是b表示的位置,而用1表示第一個元素的位置,則需要表示為a+1-1。
4、處理資料
在前面的內容中,我們已經定義了數組,初始化了數組,賦了值,那麼如何使用資料呢,其實前面已經分析過,我們通過數組下標來為數組賦值,也通過數組下標得到每個數組元素的值。
int[] a = new int[3];a[0] = 3;a[1] = 4;a[2] = 5;System.out.println(a[1]); //得到數組的第二個位置的值,將它輸出//我們也可以通過迴圈遍曆數組中每個元素for(int i = 0; i < a.length; i++){ System.out.println(a[i]); //迴圈列印出數組中每個元素}
在上面的例子中,迴圈列印的時候,我們看到,使用了a.length,通過 陣列變數名.length 可以得到數組的長度,所以上面我們通過a.length得到數組的長度為3,迴圈3次,列印出數組的元素。
不應該訪問不存在的下標
上面我們知道,我們控制數組是通過 變數名[下標] 來為變數賦值或者得到值,而如果訪問超過了數組長度的下標時,則會出現異常。
int[] a = new int[2];a[5] = 2; //a數組長度只有2個長度,而我們通過下標5訪問第6個元素,實際a數組不存在這個位置,則會出現異常。
二維數組或多維陣列
上面我們講的都是在數組中儲存一種基礎資料型別 (Elementary Data Type)或引用資料類型,而我們也可以在數組中儲存數組:
上面我們在一個數組元素中儲存了另外一個數組元素,裡面那個數組儲存了一種資料類型int的值,我們稱這樣的數組為二維數組。
二維數組的定義,初始化和賦值
資料類型[ ] [ ] 數組名 = new 資料類型[長度1][長度2] ;
長度1為外面一層數組的長度,長度2位裡面一層的長度。
定義和初始化中的形式,我們可以這樣:
int[][] a = new int[3][3];a[0][0] = 2; //訪問時前面一個方括弧的數字表示外面一層數組的元素下標,第二個方括弧的數字表示裡面一層的數組的下標a[0][1] = 3;a[0][2] = 4;a[1][0] = 5;a[1][1] = 3;a[1][2] = 9;a[2][0] = 90;a[2][1] = 70;a[2][2] = 85;
我們也可以將二維數組定義成這樣一種格式:
int[][] a = new int[3][]; //在定義初始化時設定外面一層長度為3,不設定裡面一層的長度,
a[0] = new int[2]; //初始化裡面每一層,設定長度a[1] = new int[1];a[2] = new int[3];a[0][0] = 3; //為每一個元素賦值a[0][1] = 4;a[1][0] = 9;a[2][0] = 90;a[2][1] = 70;a[2][2] = 85;
而三維數組就是數組裡面的數組裡面存放的是數組~~~~~以此類推可以有n多維陣列,不過一般人使用的不多 ~~~^_^~~~