首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 入門基礎:數組聲明、初始化、遍歷與 Arrays 工具類全攻略

     編輯:Java 綜合教學

前言:數據存儲的基石

數組是 Java 中最基本的容器,提供固定長度、同類型元素的連續內存存儲。掌握數組聲明、初始化、越界防護、工具類操作與多維數組技巧,是進階集合框架、演算法實現的前置技能。


一、什麼是數組

  • 固定長度有序容器,元素類型統一(基本類型存值、引用類型存地址)。
  • 索引從 0 開始,合法範圍 [0, length-1]。
  • 內存中連續分配,隨機訪問 O(1),插入刪除 O(n)。
  • 數組本身是引用類型,繼承 Object,實現 Cloneable、Serializable。

二、四步驟操作數組

1. 聲明數組


// 推薦風格:類型[] 變量名
int[] scores;
String[] names;
double[][] matrix;

// 兼容 C 風格:類型 變量名[]
int scores2[];

2. 分配空間(確定長度)


scores = new int[5];      // 長度 5,默認值 0
names = new String[3];    // 長度 3,默認值 null
matrix = new double[2][4]; // 二維:2 行 4 列

3. 賦值


// 逐個賦值
scores[0] = 76;
scores[1] = 85;
// ...

// 循環賦值
for (int i = 0; i < scores.length; i++) {
    scores[i] = (int)(Math.random() * 100);
}

4. 處理/輸出


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}; ❌ 靜態初始化**不能**指定長度。


四、循環遍歷三種方式

1. 普通 for(需索引/反向/步長控制)


for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}

2. 增強 for / for-each(唯讀遍歷,語法糖)


for (int val : arr) {
    System.out.print(val + " ");
}
// 編譯器轉換為迭代器模式,基本類型直接拆箱

3. while/do-while(少見)


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,避免 <=。
  • Java 9+ Objects.checkIndex(index, length) 顯式檢查。

六、Arrays 工具類核心功能

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)返回首個不同索引,相同返回 -1Arrays.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();
}

八、練習題精選

題 1:正確聲明並初始化

下列哪項正確?


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

題 2:數組拷貝陷阱


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();   // 淺拷貝,基本類型數組等同深拷貝

題 3:二維數組長度


int[][] m = {{1,2}, {3,4,5}, {6}};
m.length;        // 3 (行數)
m[0].length;     // 2
m[1].length;     // 3
m[2].length;     // 1

九、最佳實踐清單

  1. 優先用集合:業務代碼首選 ArrayList/List,動態擴容、豐富 API、泛型安全。
  2. 性能敏感用數組:底層演算法、大數據處理、JNI 交互、避免裝箱拆箱開銷。
  3. 聲明用 Type[] name:語義清晰,避免 int a, b[]; 混淆。
  4. 遍歷首選 for-each:無索引操作時,可讀性最強,無越界風險。
  5. 防禦性拷貝:方法返回內部數組時用 copyOf/clone,防止外部竄改。
  6. 多維數組謹慎用:內存不連續、訪問多次解引用,大矩陣考慮一維扁平化 index = row * COLS + col。

總結

數組是 Java 內存模型中最接近硬件的容器,掌握其聲明初始化語法、長度不可變特性、越界異常機制、Arrays 工具類豐富功能、二維鋸齒結構與遍歷模板,能寫出高效、健壯的基礎代碼。進階學習中,理解數組與集合、流式 API、並行排序的轉換關係,將解鎖更廣闊的數據處理能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved