JAVA中陣列的基本概念與用法
JAVA中陣列的基本概念與用法
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, ... };
-
注意事項:
- 靜態初始化沒有直接指定長度,但是仍然會自動推算得到長度。
- 靜態初始化標準格式可以拆分成為兩個步驟。
- 動態初始化也可以拆分成為兩個步驟。
- 靜態初始化一旦使用省略格式,就不能拆分成為兩個步驟了。
-
使用建議:
如果不確定陣列當中的具體內容,用動態初始化;否則,已經確定了具體的內容,用靜態初始化。
-
示例程式碼
-
// 省略格式的靜態初始化
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);