Java使用嵌套for循环遍历二维数组索引并实现深拷贝返回副本
核心问题说明
你当前getMatrixVals方法存在核心错误:int [][] mCopy = matrixVals;只是将私有字段的引用直接赋值给局部变量,二者仍指向堆内存中的同一个数组对象,外部修改返回的数组仍会篡改类的私有属性,不符合封装安全要求。
修复方案
嵌套遍历二维数组逻辑说明
二维数组本质是「数组的数组」,外层循环遍历行索引,内层循环遍历当前行的列索引,即可覆盖所有元素的索引位置。拷贝时需要先创建独立的新数组对象,再逐元素赋值,才能避免引用共享。
修正后的getter方法
//getter方法 public int [][] getMatrixVals() { // 获取原数组的行数 int rows = matrixVals.length; // 初始化独立的新二维数组对象,而非直接赋值引用 int [][] mCopy = new int[rows][]; // 外层循环:遍历每一行 for(int i = 0; i < rows; i++) { // 获取当前行的列数,兼容不规则二维数组(每行长度不同的场景) int cols = matrixVals[i].length; // 初始化当前行的数组 mCopy[i] = new int[cols]; // 内层循环:遍历当前行的每一列 for(int j = 0; j < cols; j++) { // 逐元素拷贝,保证两个数组完全独立 mCopy[i][j] = matrixVals[i][j]; } } // 返回独立的拷贝数组 return mCopy; }
补充优化建议
你现有setMatrixVals方法中int cols = mVals[0].length;的写法仅支持所有行长度相同的规则二维数组,如果需要兼容不规则二维数组,可参照getter的写法逐行获取列数,避免传入非规则数组时出现索引越界异常。
内容的提问来源于stack exchange,提问作者NewStudent
相关产品推荐
相关产品推荐

