从Vector获取矩阵修改后原Vector元素自动变更问题求助
问题根源:引用类型的传递特性
你遇到的其实是Java里引用类型的典型坑!像int[][]这种二维数组属于引用类型,当你执行matrix = vector.lastElement();时,并没有复制整个矩阵,只是让matrix变量指向了Vector里最后那个矩阵对象的内存地址。所以你修改matrix的元素时,本质上是直接修改了Vector里原矩阵的内容——因为它们指向的是同一个对象。
看你的代码就能发现问题:
Vector<int[][]> internalProces(int prNo, Vector<int[][]> vector) { int[][] matrix =new int[processNo][processNo]; // 这里new了数组,但马上被覆盖 matrix=vector.lastElement(); // matrix直接指向Vector里的原矩阵引用 matrix[prNo][prNo]++; // 修改的是原矩阵的元素 vector.add(matrix); // 把同一个引用再次加入Vector,现在Vector里有两个指向同一矩阵的引用 return vector; }
你一开始创建的新数组完全没用,下一行就把matrix的引用换成了原矩阵,等于白忙活了。
解决方案:复制矩阵副本,而非直接拿引用
要解决这个问题,你需要创建原矩阵的深拷贝,修改拷贝后的矩阵,再把拷贝加入Vector,这样就不会影响原Vector里的元素了。
这里给你两种实用的实现方式:
方式1:手动遍历复制二维数组
直接修改你的internalProces方法:
Vector<int[][]> internalProces(int prNo, Vector<int[][]> vector) { // 取出原矩阵 int[][] originalMatrix = vector.lastElement(); int size = originalMatrix.length; // 创建新的二维数组作为副本 int[][] newMatrix = new int[size][size]; // 逐行复制元素(用System.arraycopy比循环更高效) for (int i = 0; i < size; i++) { System.arraycopy(originalMatrix[i], 0, newMatrix[i], 0, size); } // 修改新矩阵的元素 newMatrix[prNo][prNo]++; // 将独立的新矩阵加入Vector vector.add(newMatrix); return vector; }
方式2:借助工具类简化拷贝(可选)
如果你的项目允许引入第三方库,Apache Commons Lang的ArrayUtils可以快速实现二维数组的深拷贝:
// 先在Gradle中添加依赖 // implementation 'org.apache.commons:commons-lang3:3.14.0' Vector<int[][]> internalProces(int prNo, Vector<int[][]> vector) { int[][] originalMatrix = vector.lastElement(); // 一行代码完成深拷贝 int[][] newMatrix = ArrayUtils.clone(originalMatrix); newMatrix[prNo][prNo]++; vector.add(newMatrix); return vector; }
这样修改后,你操作的是全新的矩阵副本,Vector里原来的矩阵不会被改动,新加入的也是独立的对象。
额外小建议:换用ArrayList替代Vector
顺便提一句,Vector是Java早期的集合类,现在已经不推荐使用了——它的方法都是同步的,性能不如ArrayList。如果你的场景不需要线程同步,建议换成ArrayList<int[][]>来使用哦~
内容的提问来源于stack exchange,提问作者Blanaru Daniel
相关产品推荐
相关产品推荐

