天天看點

[Java筆記]1.6 Java基本知識——數組

數組是一種很常用的引用資料類型,用來存放一系列同類型的資料。通路時隻需要變換一個整型下标就可以通路到數組中的每一個元素。元素是數組中内容的别稱,數組中每一項稱為一個元素。

1.聲明

數組的聲明需要指出數組中元素的類型和數組變量名,并且有兩種方式聲明:(1).資料類型[] 數組變量名 (2).資料類型 數組變量名[]。

int[] array; 
int array[];
           

這兩種聲明都可以聲明一個名為array的int類型數組,但大多數人習慣第一種寫法,因為這樣數組變量名會獨立出來,一目了然。

2.初始化

在上一步聲明之後,array還沒有稱為一個真正的數組,它現在還沒有自己的記憶體空間,隻有一個名字。是以,聲明後緊接着還要對數組進行初始化。初始化需要用new關鍵字來開辟一段記憶體,建立數組。格式為 類型[] 數組變量名 = new 類型 [數組大小];。

int[] array = new int[10];
           

這樣,array數組現在就可以容納十個int類型的資料了。在剛初始化完成後,所有的元素都是預設值,整型預設是0,浮點型預設是0.0,布爾型預設是false,字元串類型為null。

我們也可以在初始化的同時為數組元素指派。格式為 類型[] 數組變量名 = new 類型[] {值1,值2,……};。注意這裡的[]中不寫數組大小。而且,用這種方式初始化時,可以将 new 和 類型 省略。即類型[] 數組變量名 = {值1,值2,……};。

int[] array_1 = new int[]{10, 20, 30};
int[] array_2 = {10, 20, 30};          //array_1與array_2中元素是一樣的
           

一旦建立好數組後,就不能改變其大小。而且任何對其規定範圍外的通路都會引發異常。若需要在運作過程中需要變化數組大小,可以嘗試ArrayList動态數組。

3.通路

對數組的通路可以使用一個整型下标來完成。格式為 數組名[下标]。如:

int[] array = {2,4,6,8};
System.out.println(array[0]); //輸出2
System.out.println(array[1]); //輸出4
           

每一個數組的下标都是從0開始的,也就是當我們建立了一個長度為n的數組,那該數組的下标界限就是0 ~ n-1。

而數組因其特有的性質,我們可以更加友善地使用循環結構對其通路。

int[] a = new int[10];
for(int i = 0; i < 10; i++)
{
    a[i] = i + 1;
}
//該for循環結束後數組a内容為{1,2,3,4,5,6,7,8,9,10}

for(int i : a)
    System.out.println(i);
//該增強for循環從a[0]開始依次輸出a中每一個元素。
           

注:這裡增強for隻能用于輸出不能輸入。

4.數組變量與執行個體的關系

考慮以下情況:

int[] a = new int[] {1,2,3};
int[] b = new int[] {1,2,3};
int[] c = a;
           

這裡的數組b和c中元素相同嗎?修改數組a中元素後b和c還相同嗎?

首先用for循環周遊輸出a,b,c。得到的結果是這樣:

a:1 2 3 
b:1 2 3 
c:1 2 3 
           

顯然a,b,c中元素相同。此時在數組abc的聲明代碼後再加一行代碼 a[0] = 4; ,将a中元素修改,此時a數組中元素顯然為{4,2,3}。再輸出三個數組中元素,結果為:

a:4 2 3 
b:1 2 3 
c:4 2 3 
           

此時a與c均發生了變化,都變成了{4,2,3}。這是為什麼呢?

事實上這是數組拷貝,當一個數組變量指派為另一個數組變量時,這兩個變量就會指向同一個數組實體。

用一個同學舉的例子來說,就像是a與c合租了。a與c雖然不是同一個人,但他們指向同一個房子。若a,b,c都要回家使用冰箱,則a與c使用的是同一個冰箱,而b則獨自占用一個冰箱。當a把冰箱裡的牛奶拿出來換成了酸奶(a[0] = 4),則c使用的冰箱裡的牛奶也會變成酸奶(c[0] = 4),而b則不受影響。

多個數組變量效果也一樣,若這樣寫:c = a; b = a; 則a,b,c三個變量就指向同一個數組實體,abc三人就住在同一個房子裡,這下b的牛奶也沒有了。

5.二維與多元數組

既然數組元素可以為任何類型,那我們就可以将一個一維數組作為數組的類型,這樣就産生了二維數組。二維數組有兩個下标,通過這兩個下标可以通路每個元素。就像一個平面直角坐标系,通過x,y軸坐标就可以定位不同的點。

二維數組的聲明:類型[][]  數組變量名。同樣,聲明後需要初始化。而與一維不同的是,用具體值來初始化時需要兩層大括号才能完成。

int[][] array_2d1 = new int[2][3];
int[][] array_2d2 = new int[][] {{1,2,3},{4,5,6}};
int[][] array_2d3 = {{1,2,3},{4,5,6}};
           

以上三種聲明方式均可。

二維數組通路時可以采用雙層循環嵌套來通路每一個元素。

for(int i = 0; i < 2; i++) //該循環可以依次輸出array_2d3的每個元素
{
    for(int j = 0; j < 3; j++)
    {
        System.out.println(array_2d3[i][j]);
    }
}
           

三維及以上的數組與二維類似,此處不再贅述。