什麼是數組?
數組是相同類型的變量按順序組成的一種複合數據類型,這些相同類型的變量稱爲數組的元素或單元。數組通過數組名加索引來使用數組的元素,索引從 0 開始。
1.數組的聲明
聲明數組包括聲明數組的名字、數組元素的數據類型。
聲明一維數組有下列兩種格式:
數組的元素類型 數組名字[];
數組的元素類型[] 數組名字;
聲明二維數組有下列兩種格式:
數組的元素類型 數組名字[][];
數組的元素類型[][] 數組名字;
例如:
float[] boy; //一維數組
char cat[][]; //二維數組
.
那麼數組 boy 的元素可以存放 float 型數據,數組 cat 的元素可以存放 char 型數據。
數組的元素類型可以是 Java 中的任一種類型。假如已經聲明一種 Person 類型數據,那麼可以如下聲明一個數組:
Person ps[];
將來數組 ps 的元素可以存放 Person 類型的數據。
注:與 C/C++ 不同,Java 不允許在聲明數組中的方括號內指定數組元素的個數。
若聲明:
int a[12];
或
int[12] a;
將導致語法錯誤。
2.數組的創建
聲明數組僅僅是給出了數組名字和元素的數據類型,要想真正使用數組還必須爲它分配內存空間,即創建數組。
爲數組分配內存空間的格式如下:
數組名字 = new 數組元素的類型[數組元素的個數];
例如:
boy = new float[4];
.
爲數組分配內存空間後,數組boy獲得 4 個用來存放 float 類型數據的內存空間,即 4 個 float 型元素。數組變量 boy 中存放着這些內存單元的首地址,該地址稱爲數組的引用,這樣數組就可以通過索引操作這些內存單元。數組屬於引用型變量,數組變量中存放着數組的首元素地址,通過數組名加索引使用數組的元素,例如:
boy[0] = 12;
boy[1] = 23.901F;
boy[2] = 100;
boy[3] = 10.23f;
內存分配示意圖如下:
聲明數組和創建數組可以一起完成,例如:
float boy[] = new float[4];
二維數組和一維數組一樣,在聲明之後必須用 new 運算符分配內存空間,例如:
int test[][];
test = new int[3][4];
或
int test[][] = new int[3][4];
.
Java採用“數組的數組”聲明多維數組,一個二維數組是由若干個一維數組構成的。
例如:上述創建的二維數組 test 就是由 3 個長度爲 4 的一維數組test[0]、test[1] 和 test[2] 構成的。
構成二維數組的一維數組不必有相同的長度,在創建二維數組時可以分別指定構成該二維數組的一維數組的長度,例如:
int a[][] = new int[3][];
.
創建了一個二維數組 a,a 由3個一維數組 a[0]、a[1] 和 a[2]構成,但它們的長度還沒有確定,即這些一維數組還沒有分配內存空間,所以二維數組 a 還不能使用,必須創建它的3個一維數組。例如:
a[0] = new int[6];
a[1] = new int[12];
a[2] = new int[8];
注:和 C 語言不同的是,Java允許使用 int 型變量的值指定數組元素的個數。例如:
int size = 30;
double number[] = new double[size];
3.數組元素的使用
一維數組通過索引符訪問自己的元素,如 boy[0]、boy[1]等。需要注意的是,索引從 0 開始,因此,數組若有 7 個元素,那麼索引到 6 爲止。如果程序使用瞭如下語句:
boy[7] = 384.98f;
程序可以編譯通過,但運行時將發生 ArrayIndexOutOfBoundsException 異常,因此,用戶在使用數組時必須謹慎,防止索引越界。
二維數組也通過索引符訪問自己的元素,如 a[0][1]、a[1][2] 等。需要注意的是,索引從 0 開始,例如聲明創建了一個二維數組 a:
int a[][] = new int[2][3];
那麼第一個索引的變化範圍是從 0 到 1,第二個索引的變化範圍從 0 到 2。
4.length的使用
數組的元素的個數稱爲數組的長度。對於一維數組,“數組名字.length”的值就是數組中元素的個數;對於二維數組,“數組名字.length”的值是它含有的一維數組的個數。例如,對於:
float a[] = new float[12];
int b[][] = new int[3][6];
a.length 的值是 12,b.length 的值是3。
5.數組的初始化
創建數組後,系統會給每個數組元素一個默認的值,例如,float 型是 0.0。
在聲明數組的同時也可以給數組的元素一個初始值,例如:
float boy[] = {21.3f,23.89f,2.0f,23f,778.98f};
上述語句相當於:
float boy[] = new float[5];
然後:
boy[0] = 21.3f;
boy[1] = 23.89f;
boy[2] = 2.0f;
boy[3] = 23f;
boy[4] = 778.98f;
也可以直接用若干個一維數組初始化一個二維數組,這些一維數組的長度不盡相同,例如:
int a[][] = {{1},{1,1,},{1,2,1},{1,3,3,1},{1,4,6,4,1}};
6.數組的引用
相信大多數朋友已經知道,數組屬於引用型變量,因此,兩個相同類型的數組如果具有相同的引用,它們就有完全相同的元素。
例如,對於:
int a[] = {1,2,3},b[] = {4,5};
數組 a 和 b 中分別存放着引用 0x35ce36 和 0x757aef,內存模型如下圖所示:
如果使用了下列賦值語句(a 和 b 的類型必須相同):
a = b;
那麼,a 中存放的引用和 b 的相同,這時系統將釋放最初分配給數組 a 的元素,使得 a 的元素和 b 的元素相同,a 、b 的內存模型變成如下圖所示:
下面的例子使用了數組,運行效果如下圖所示:
例子代碼如下:
public class Main {
public static void main(String[] args) {
int a[] = {1, 2, 3, 4};
int b[] = {100, 200, 300};
System.out.println("數組a的元素個數 = " + a.length);
System.out.println("數組b的元素個數 = " + b.length);
System.out.println("數組a的引用 = " + a);
System.out.println("數組b的引用 = " + b);
System.out.println("a == b 的結果是" + (a == b));
a = b;
System.out.println("數組a的元素個數 = " + a.length);
System.out.println("數組b的元素個數 = " + b.length);
System.out.println("數組a的引用 = " + a);
System.out.println("數組b的引用 = " + b);
System.out.println("a == b 的結果是" + (a == b));
System.out.println("a[0] = " + a[0] + ",a[1] = " + a[1] + ",a[2] = " + a[2]);
System.out.print("b[0] = " + b[0] + ",b[1] = " + b[1] + ",b[2] = " + b[2]);
}
}
需要注意的是,對於 char 型數組 a,System.out.println(a) 不會輸出數組 a 的引用,而是輸出數組 a 的所有元素的值。
例如,對於:
char a[] = {'A','你','好','呀'};
System.out.println(a) 的輸出結果是:
A你好呀
如果想輸出 char 型數組的引用,必須讓數組 a 和字符串做並置運算。
例如:
System.out.println("" + a);
其輸出結果是數組的引用。
感謝師傅來訪,技術不精,請勿吐槽,如有問題請留言。