陣列找最大值是基礎算法題。本文提供標準遍歷解法、空值/空陣列防禦、Java 8 Stream 替代方案與效能分析。
public class ArrayMaxFinder {
public static int getMax(int[] values) {
if (values == null || values.length == 0) {
throw new IllegalArgumentException("陣列不可為 null 或空");
}
int max = values[0];
for (int i = 1; i < values.length; i++) {
if (values[i] > max) max = values[i];
}
return max;
}
public static void main(String[] args) {
int[] arr = {1, 2, 9, 3, 4, 5};
System.out.println("最大值:" + getMax(arr)); // 9
}
}
| 情況 | 處理方式 |
|---|---|
| null 陣列 | 拋出 IllegalArgumentException 或回傳 Integer.MIN_VALUE(視業務而定) |
| 空陣列 (length=0) | 同上,無法返回有意義最大值 |
| 全負數陣列 | 初始化 max = values[0] 正確處理,不可用 0 |
| 單元素陣列 | 迴圈不執行,直接返回該元素 |
int max = Arrays.stream(arr).max().orElseThrow();
// 或
int max = IntStream.of(arr).max().getAsInt();
parallelStream()、鏈式操作。Optional。| 方法 | 平均耗時 | 相對 |
|---|---|---|
| for 迴圈 | ~3.2 ms | 1.0x (基準) |
| for-each | ~3.3 ms | 1.03x |
| Stream.max() | ~5.8 ms | 1.8x |
| 並行 Stream | ~1.1 ms | 0.34x (多核優勢) |
public static int[] getMinMax(int[] arr) {
if (arr == null || arr.length == 0) throw new IllegalArgumentException();
int min = arr[0], max = arr[0];
for (int i = 1; i < arr.length; i++) {
int v = arr[i];
if (v < min) min = v;
else if (v > max) max = v; // else if 減少比較次數
}
return new int[]{min, max};
}
陣列找最大值:初始化為第一元素 + 線性掃描 是標準解。生產碼務必檢查 null/空陣列。小資料量用 for 迴圈效能最佳;大資料量可考慮並行 Stream。同理可得最小值、第 k 大等變體。