調用矩陣相加方法後,原輸入矩陣 a 的值竟然變成了結果矩陣 c 的值。
public int[][] matrix_add(int[][] a, int[][] b) {
int[][] c = a; // 錯誤關鍵行
if (inputLegal(a, b, TYPE_ADD)) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
c[i][j] = a[i][j] + b[i][j]; // 實際在修改 a
}
}
}
return c;
}
Java 中數組是**引用類型**。int[][] c = a; 只是讓 c 指向與 a 同一塊堆內存地址。對 c 任何元素的修改,本質上都是在修改 a。
public int[][] matrix_add(int[][] a, int[][] b) {
// 1. 創建新數組存放結果
int[][] c = new int[a.length][a[0].length];
if (inputLegal(a, b, TYPE_ADD)) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
c[i][j] = a[i][j] + b[i][j];
}
}
}
return c;
}
List、Map 等集合賦值也是引用傳遞,需用 new ArrayList<>(oldList) 或流式複製創建新對象。