Java 程式碼最佳化
Pavlos Kosmetatos
Lead Engineer @Wealthyhood
理解空間複雜度很重要,才能打造:
OutOfMemoryError 的當機錯誤表示法與時間複雜度相同。
常見複雜度類別:
O(1):常數等級——與大小無關O(n):線性等級——隨輸入成長O(n²):平方等級——隨輸入平方成長public int findMax(int[] array) {
int max = Integer.MIN_VALUE;
for (int value : array) {
if (value > max) {
max = value;
}
}
return max;
}
不論整數陣列有 10 個或 1,000 萬個元素,我們只需為單一變數 max 配置記憶體
空間複雜度是 O(1),也就是常數空間
public int[] doubleValues(int[] array) {
int[] result = new int[array.length];
for (int i = 0; i < array.length; i++) {
result[i] = array[i] * 2;
}
return result;
}
n 個元素,就需要為 n 個額外元素配置空間O(n),因為額外記憶體隨輸入大小線性成長public int[][] multiplicationTable(int n) {
int[][] table = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
table[i][j] = (i + 1) * (j + 1);
}
}
return table;
}
n 是 10,需要 100 個儲存格;若 n 是 100,需要 10,000 個儲存格O(n²)記憶體是有限資源!
上述範例在輸入大小為 10,000 時的情況:
findMax,O(1) -> 只需多幾個位元組doubleValues,O(n) -> 約 40KB 額外記憶體multiplicationTable,O(n²) -> 約 400MB 額外記憶體
別忘了:

Java 程式碼最佳化