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

Java 陣列完整指南:宣告、初始化、遍歷與記憶體模型

     編輯:Java 相關知識

陣列是 Java 中儲存同類型資料的固定長度容器,也是引用型別的基礎。本文系統梳理陣列的宣告語法、動態/靜態初始化、預設值、遍歷方式、記憶體佈局(堆/棧)及常見陷阱,助你建立扎實的陣列操作功力。

陣列的本質與記憶體模型

  • 引用型別:陣列變數儲存在棧,實際元素儲存在堆,透過引用(地址)連結。
  • 固定長度:一經初始化長度不可變;需動態擴容請改用 ArrayList。
  • 索引從 0 開始:合法範圍 [0, length-1],越界拋 ArrayIndexOutOfBoundsException。

宣告與初始化兩大範式

1. 動態初始化:指定長度,預設值填充

int[] scores = new int[3]; // 長度 3,元素預設為 0
double[] rates = new double[5]; // 預設 0.0
boolean[] flags = new boolean[2]; // 預設 false

預設值速查:數值型 0/0.0、char '\u0000'、boolean false、引用型 null。

2. 靜態初始化:直接給定元素,長度自動推導

// 簡寫形式(僅限宣告時)
int[] scores = {80, 90, 75};

// 完整形式(可用於賦值語句)
int[] scores = new int[] {80, 90, 75};

⚠️ 不可混用:new int[3] {1,2,3} 編譯錯誤。

陣列遍歷三種寫法

傳統 for 迴圈(需索引時)

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

增強型 for-each(唯讀遍歷)

for (int item : arr) {
    System.out.println(item);
}

迴圈變數型別需 ≥ 元素型別(int 陣列可用 long 接收,不可用 byte)。

工具類 Arrays.toString() 快速除錯

System.out.println(Arrays.toString(arr)); // 輸出:[80, 90, 75]

陣列作為方法參數與返回值

傳遞陣列實為傳遞引用,方法內修改元素會影響原陣列;若重新指派參數變數(arr = new int[5]),則不影響外部引用。

public static void modify(int[] arr) {
    arr[0] = 99;        // 影響原陣列
    arr = new int[3];   // 僅改變區域引用,外部無感
}

常用陣列演算法範例

尋找最大/最小值

public static int getMax(int[] arr) {
    int max = arr[0];
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] > max) max = arr[i];
    }
    return max;
}

計算總和與平均

public static double getAverage(int[] arr) {
    long sum = 0;
    for (int v : arr) sum += v;
    return (double) sum / arr.length;
}

格式化列印 [v1, v2, ...]

public static void printArray(int[] arr) {
    System.out.print("[");
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + (i == arr.length - 1 ? "]" : ", "));
    }
    System.out.println();
}

特殊情況與避坑指南

  • 長度為 0 的陣列:int[] empty = {} 或 new int[0],合法但無元素,存取會越界。
  • 陣列擴容:只能建立新陣列複製(Arrays.copyOf 或手動迴圈),原陣列長度不可變。
  • 多維陣列:本質是「陣列的陣列」,int[][] matrix = new int[3][4];每行長度可不同(鋸齒陣列)。
  • 不要宣告 public static final 陣列:引用不可變,但元素可被任意修改,存在安全隱患。

記憶體圖解:new 關鍵字的含義

int[] a = new int[3]; // 堆開闢新空間,地址 0x100
int[] b = new int[3]; // 堆開闢另一空間,地址 0x200
int[] c = a;          // c 指向 0x100,修改 c[0] 影響 a

只要執行 new,必在堆開闢新記憶體;直接賦值陣列變數則共享同一堆空間。

總結

陣列是 Java 資料結構的基石,掌握其初始化、遍歷、記憶體語義與常見演算法,能應對 80% 的資料處理場景。進階學習建議:深入 Arrays、Collections 工具類,並對比 ArrayList、LinkedList 的動態擴容機制。

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