你真的瞭解JAVA數組嗎?(上)

什麼是數組?
  數組是相同類型的變量按順序組成的一種複合數據類型,這些相同類型的變量稱爲數組的元素或單元。數組通過數組名加索引來使用數組的元素,索引從 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);

其輸出結果是數組的引用。

感謝師傅來訪,技術不精,請勿吐槽,如有問題請留言。

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