數組是 Java 中最基本的容器,提供固定長度、同類型元素的連續內存存儲。掌握數組聲明、初始化、越界防護、工具類操作與多維數組技巧,是進階集合框架、演算法實現的前置技能。
[0, length-1]。Object,實現 Cloneable、Serializable。
// 推薦風格:類型[] 變量名
int[] scores;
String[] names;
double[][] matrix;
// 兼容 C 風格:類型 變量名[]
int scores2[];
scores = new int[5]; // 長度 5,默認值 0
names = new String[3]; // 長度 3,默認值 null
matrix = new double[2][4]; // 二維:2 行 4 列
// 逐個賦值
scores[0] = 76;
scores[1] = 85;
// ...
// 循環賦值
for (int i = 0; i < scores.length; i++) {
scores[i] = (int)(Math.random() * 100);
}
System.out.println(scores[0]); // 單個訪問
System.out.println(Arrays.toString(scores)); // 整體輸出 [76, 85, ...]
// 完整寫法
int[] scores = new int[] {78, 23, 44, 78};
// 簡寫(僅限聲明時)
int[] scores2 = {78, 23, 44, 78};
// 二維靜態初始化
int[][] grid = {
{1, 2, 3},
{4, 5},
{6, 7, 8, 9} // 不規則數組(鋸齒數組)
};
易錯點:int[] a = new int[3] {1,2,3}; ❌ 靜態初始化**不能**指定長度。
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
for (int val : arr) {
System.out.print(val + " ");
}
// 編譯器轉換為迭代器模式,基本類型直接拆箱
int i = 0;
while (i < arr.length) {
System.out.print(arr[i++] + " ");
}
int[] a = new int[2]; // 索引 0,1
System.out.println(a[2]); // 運行時拋出 ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2
i < arr.length,避免 <=。Objects.checkIndex(index, length) 顯式檢查。java.util.Arrays 提供靜態方法,覆蓋排序、查找、比較、填充、轉字符串、流式轉換。
| 方法 | 說明 | 示例 |
|---|---|---|
| sort(arr) | 原地升序排序(基本類型 Dual-Pivot Quicksort,對象 TimSort) | Arrays.sort(nums) |
| sort(arr, from, to) | 區間排序 [from, to) | Arrays.sort(nums, 1, 4) |
| binarySearch(arr, key) | 二分查找,**前提已排序** | int idx = Arrays.binarySearch(nums, 5) |
| toString(arr) | 格式化輸出 [e1, e2, ...] | System.out.println(Arrays.toString(arr)) |
| deepToString(arr) | 多維數組遞歸輸出 | Arrays.deepToString(matrix) |
| equals(arr1, arr2) | 長度+逐元素 equals 比較 | Arrays.equals(a, b) |
| deepEquals(arr1, arr2) | 多維遞歸比較 | Arrays.deepEquals(m1, m2) |
| fill(arr, val) | 全部填充值 | Arrays.fill(arr, -1) |
| fill(arr, from, to, val) | 區間填充 | Arrays.fill(arr, 2, 5, 0) |
| copyOf(arr, newLen) | 拷貝並調整長度(截斷/補默認值) | int[] b = Arrays.copyOf(a, 10) |
| copyOfRange(arr, from, to) | 區間拷貝 [from, to) | int[] sub = Arrays.copyOfRange(a, 1, 4) |
| stream(arr) | 轉 IntStream/DoubleStream/Stream<T> | Arrays.stream(arr).filter(x->x>0).sum() |
| parallelSort(arr) | 並行排序(大數據量多核優勢) | Arrays.parallelSort(bigArray) |
| mismatch(arr1, arr2) | 返回首個不同索引,相同返回 -1 | Arrays.mismatch(a, b) |
| compare(arr1, arr2) | 字典序比較(Java 9+) | Arrays.compare(a, b) |
int[][] matrix = new int[3][4]; // 3 行 4 列
matrix[0][0] = 1;
matrix[2][3] = 99;
int[][] jagged = new int[3][];
jagged[0] = new int[2];
jagged[1] = new int[5];
jagged[2] = new int[1];
// 或靜態初始化
int[][] jagged2 = {{1,2}, {3,4,5,6,7}, {8}};
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) { // 每行長度可能不同
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
// for-each 版
for (int[] row : matrix) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}
下列哪項正確?
A. int[] a = new int[3] {1,2,3}; // ❌ 靜態初始化不可指定長度
B. int[] a = {1,2,3}; // ✅ 正確
C. int a[] = new int[] {1,2,3}; // ✅ 正確(C 風格聲明)
D. int[] a = new int[3]; a = {1,2,3}; // ❌ 賦值語句不能用靜態初始化語法
答案:B、C
int[] a = {1,2,3};
int[] b = a; // 引用拷貝,指向同一對象
b[0] = 99;
System.out.println(a[0]); // 99
// 正確獨立拷貝
int[] c = Arrays.copyOf(a, a.length);
int[] d = a.clone(); // 淺拷貝,基本類型數組等同深拷貝
int[][] m = {{1,2}, {3,4,5}, {6}};
m.length; // 3 (行數)
m[0].length; // 2
m[1].length; // 3
m[2].length; // 1
ArrayList/List,動態擴容、豐富 API、泛型安全。Type[] name:語義清晰,避免 int a, b[]; 混淆。copyOf/clone,防止外部竄改。index = row * COLS + col。數組是 Java 內存模型中最接近硬件的容器,掌握其聲明初始化語法、長度不可變特性、越界異常機制、Arrays 工具類豐富功能、二維鋸齒結構與遍歷模板,能寫出高效、健壯的基礎代碼。進階學習中,理解數組與集合、流式 API、並行排序的轉換關係,將解鎖更廣闊的數據處理能力。