1. 程式人生 > 實用技巧 >JAVA中陣列的基本概念與用法

JAVA中陣列的基本概念與用法

JAVA中陣列的基本概念與用法

1. 陣列的定義與特點

  • 陣列的一種引用資料型別
  • 陣列中可以同時存放多個數據,但是資料的型別必須統一
  • 陣列的長度在開始時就需要確定,在程式執行期間是不可改變的
    • 雖然可以使用陣列的擴容機制來擴充陣列的長度,但是這個方法也比較麻煩

2. 陣列的初始化

  • 陣列的初始化方式有兩種

    1. 動態初始化
    2. 靜態初始化

    動態初始化特點:

    ​ 在建立陣列的時候,直接指定陣列當中的資料元素個數。

    動態初始化陣列的格式:

    資料型別[] 陣列名稱 = new 資料型別[陣列長度];

    解析含義:

    左側資料型別:也就是陣列當中儲存的資料,全都是統一的什麼型別

    左側的中括號:代表是一個數組

    左側陣列名稱:給陣列取一個名字

    右側的new:代表建立陣列的動作

    右側資料型別:必須和左邊的資料型別保持一致

    右側中括號的長度:也就是陣列當中,到底可以儲存多少個數據,是一個int數字

    • 動態建立陣列的示例程式碼:
    // 資料型別[] 陣列名稱 = new 資料型別[陣列長度];
    // 定義一個int型別的陣列,可以存放10個數據
    int[] arrayA = new int[10];
    
    // 給建立的陣列賦值
    for (int i = 0; i < 10; i ++){
        arrayA[i] = i;
    }
    
    // 輸出陣列中的值
    for (int i = 0; i < 10; i ++){
        System.out.print(arrayA[i]);
    }
    
    • 靜態初始化陣列

      • 靜態初始化陣列的特點:

        ​在建立陣列的時候,不直接指定資料個數多少,而是直接將具體的資料內容進行指定。

      • 靜態初始化基本格式:

        ​資料型別[] 陣列名稱 = new 資料型別[] { 元素1, 元素2, ... };

      • 注意事項:

        ​雖然靜態初始化沒有直接告訴長度,但是根據大括號裡面的元素具體內容,也可以自動推算出來長度

      • 靜態初始化陣列示例程式碼

        // 資料型別[] 陣列名稱 = new 資料型別[] { 元素1, 元素2, ... };
        // 建立一個數組,一開始陣列中就有1,2,3,4,5 這些值
        int [] arrayA = new int[] {1, 2, 3, 4, 5,};
        // 輸出陣列中的使用元素
        for (int i = 0; i < arrayA.length; i ++){
            System.out.print(arrayA[i]);
        }
        

  • 陣列初始化的省略格式

    • 標準格式:

      ​資料型別[] 陣列名稱 = new 資料型別[] { 元素1, 元素2, ... };

    • 省略格式:

      資料型別[] 陣列名稱 = { 元素1, 元素2, ... };

    • 注意事項:

    1. 靜態初始化沒有直接指定長度,但是仍然會自動推算得到長度。
    2. 靜態初始化標準格式可以拆分成為兩個步驟。
    3. 動態初始化也可以拆分成為兩個步驟。
    4. 靜態初始化一旦使用省略格式,就不能拆分成為兩個步驟了。
    • 使用建議:

      如果不確定陣列當中的具體內容,用動態初始化;否則,已經確定了具體的內容,用靜態初始化。

    • 示例程式碼

// 省略格式的靜態初始化
int[] arrayA = { 10, 20, 30 };

// 靜態初始化的標準格式,可以拆分成為兩個步驟
int[] arrayB;
arrayB = new int[] { 11, 21, 31 };

// 動態初始化也可以拆分成為兩個步驟
int[] arrayC;
arrayC = new int[5];

// 靜態初始化的省略格式,不能拆分成為兩個步驟。(錯誤寫法,編譯器直接報錯)
// int[] arrayD;
// arrayD = { 10, 20, 30 };
}

3. 獲取陣列中的元素

  • 使用動態初始化陣列的時候,其中的元素將會自動擁有一個預設值。規則如下:
    如果是整數型別,那麼預設為0;
    如果是浮點型別,那麼預設為0.0;
    如果是字元型別,那麼預設為'\u0000';
    如果是布林型別,那麼預設為false;
    如果是引用型別,那麼預設為null。

  • 注意事項:

    靜態初始化其實也有預設值的過程,只不過系統自動馬上將預設值替換成為了大括號當中的具體數值。

  • 對於陣列而言,陣列的下標是從0開始的,訪問的時候需要注意。

 // 建立一個數組
 int[] arrayA = new int[10];
 // 給陣列中新增元素,陣列的下標從0開始;
 arrayA[0] = 1;
 arrayA[1] = 2;
 arrayA[2] = 3;

 // 直接定義陣列的名稱,將輸出陣列在記憶體中經過雜湊得到的地址值
 System.out.println(arrayA);

 // 使用Arrays中的toString()方法輸出陣列,
 // 從得到的結果中會發現沒有賦值的位置會自動使用0補齊。
 System.out.println(Arrays.toString(arrayA));

 // 獲取陣列中一個指定位置的元素值
 // 例如:獲取下標為0的元素值
 System.out.println(arrayA[0]);

4.Java中的記憶體劃分(圖片來自網路)

5. 假設一個數組的記憶體圖

  • 棧中的變數地址指向堆中的記憶體地址

6. JAVA中的淺拷貝

  • 如果在JAVA中發生瞭如下程式碼的賦值方式,那麼整個就是淺拷貝,即arrayB陣列修改陣列中的元素值之後會影響arrayA中的陣列的元素值。

    int[] arrayA = new int[3];
    System.out.println(arrayA); // 地址值
    System.out.println(arrayA[0]); // 0
    System.out.println(arrayA[1]); // 0
    System.out.println(arrayA[2]); // 0
    System.out.println("==============");
    
    arrayA[1] = 10;
    arrayA[2] = 20;
    System.out.println(arrayA); // 地址值
    System.out.println(arrayA[0]); // 0
    System.out.println(arrayA[1]); // 10
    System.out.println(arrayA[2]); // 20
    System.out.println("==============");
    
    // 特別注意這個地方
    // 將arrayA陣列的地址值,賦值給arrayB陣列
    int[] arrayB = arrayA;
    System.out.println(arrayB); // 地址值
    System.out.println(arrayB[0]); // 0
    System.out.println(arrayB[1]); // 10
    System.out.println(arrayB[2]); // 20
    System.out.println("==============");
    
    arrayB[1] = 100;
    arrayB[2] = 200;
    System.out.println(arrayB); // 地址值
    System.out.println(arrayB[0]); // 0
    System.out.println(arrayB[1]); // 100
    System.out.println(arrayB[2]); // 200
    }
    
    • 記憶體示例圖

7. 陣列越界的異常資訊

  • 示例程式碼

    // 資料型別[] 陣列名稱 = new 資料型別[陣列長度];
    // 定義一個int型別的陣列,可以存放10個數據
    int[] arrayA = new int[10];
    // 給建立的陣列賦值
    for (int i = 0; i < 10; i ++){
        arrayA[i] = i;
    }
    // 想要定義下標為10的對應元素值,但是陣列的最大長度只是9,
    // 因為陣列的下標是從0開始的,雖然在編譯器不會報錯,
    // 但是在執行期會直接丟擲陣列越界異常資訊。
    System.out.println(arrayA[10]);
    
    • 異常資訊截圖

8. 陣列中的空指標異常

int[] arrayA = null;
System.out.println(arrayA[0]);

9. 獲取陣列的長度

// 資料型別[] 陣列名稱 = new 資料型別[陣列長度];
// 定義一個int型別的陣列,可以存放10個數據
int[] arrayA = new int[10];
// length可以獲取陣列的長度
System.out.println(arrayA.length);