基礎程式設計(Java)· CH7

陣列與 ArrayList

一次裝很多筆資料 · 導覽地圖

完整內容看 PDF 講義,動手走訪與試跑看 index。

為什麼要陣列

一次裝一整排同型別資料

10[0] 20[1] 30[2] 40[3] 50[4]

三特性:同型別固定長度連續編號。索引從 0length-1

宣告與配置

new 與初始化清單

int[] a = new int[5];          // 5 格,預設值全 0
int[] b = {10, 20, 30, 40, 50}; // 初始化清單,長度自動為 5

最後一格 a[a.length-1]a[5](長度 5)會越界

走訪型一

傳統 for:有索引、能改值

for (int i = 0; i < a.length; i++)   // 用 < 不是 <=
    System.out.println(a[i]);

a.length欄位、沒括號。需要索引或要改元素值時用它。

走訪型二

增強 for:只讀、乾淨

for (int x : a)        // x 依序拿到每個元素「值」
    System.out.println(x);

拿不到索引,也改不到陣列內容(x 是副本)。只讀時優先用。

三招演算法

求和 · 找最大 · 計次

int total = 0; for (int x : a) total += x;        // 求和
int max = a[0]; for (int x : a) if (x>max) max=x; // 找最大
int cnt = 0; for (int x : a) if (x>4) cnt++;      // 計次

找最大 max 初值設 a[0],不要設 0(全負數會錯)。

陣列是物件

傳給方法是傳「位址」

int[] b = a;     // b 和 a 指向同一個陣列(沒複製)
b[0] = 99;       // a[0] 也跟著變 99

方法內改元素,呼叫端看得到(和 CH6 值傳遞不同)。

多維

int[][]:陣列的陣列

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

m[r] 是一個一維陣列,m[r][c] 才是元素。

可變大小

ArrayList:自動增減

ArrayList<String> list = new ArrayList<>();
list.add("Amy");   // 加到尾端
list.get(0);       // 取第 0 個
list.size();       // 個數(方法、有括號)
list.remove("Amy");

動態大小、只裝物件(ArrayList<Integer>);個數用 size() 不是 length

選型

陣列 vs ArrayList

陣列
固定長度
原始/物件都裝
.length
ArrayList
動態增減
只裝物件
.size()

事先知道筆數、不會增刪 → 陣列;會增刪、筆數不定 → ArrayList。

收尾兩個語法

varargs 與命令列引數

static double average(double... nums) {  // 收 0~N 個,方法內是 double[]
    double t = 0; for (double d : nums) t += d;
    return t / nums.length;              // 用 .length 取個數
}
public static void main(String[] args) { // 執行 java Demo 5 0 4
    int n = Integer.parseInt(args[0]);    // args 是 String[],要自己轉
}

varargs型別... 在方法內當陣列、只能放最後一個命令列引數:進 main(String[] args)、一律字串、用 args.length 取個數。

接下來

把陣列練到自動

  • PDF 講義 完整內容+記憶體格子圖+走訪步進
  • index 陣列逐格走訪+試跑
  • 本地練習 5 題 求和/最大/反轉/計次/ArrayList
  • 複習測驗 自測到 90%