首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 二維數組傳遞導致原數組被修改的根因與修正

     編輯:程式設計綜合問答

現象

調用矩陣相加方法後,原輸入矩陣 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) 或流式複製創建新對象。
  • 基本類型傳值,引用類型傳引用(值傳遞引用地址),這是 Java 參數傳遞的核心機制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved