Java中二维Vector((n*n)×n矩阵)元素更新问题求助及优化
问题定位:重复引用踩的经典坑
嘿,我一眼就瞅到你代码里的核心问题了——你把同一个Vector对象重复添加到矩阵里了,这可是Java集合新手常踩的经典坑!
看你初始化矩阵的这段代码:
Vector<Integer> tmpMatrix = new Vector<Integer>(); for(int i = 0;i < n;i++) tmpMatrix.addElement(-1); // initialize tmpMatrix for(int j = 0; j < n*n; j++){ matrix.addElement(tmpMatrix); } // initialize matrix
你只创建了一个tmpMatrix实例,然后循环n*n次把它塞进matrix里。这意味着matrix里的所有"行"其实都是指向同一个Vector的引用!不管你修改哪一行的元素,所有行都会跟着变——因为它们根本就是同一个对象,这就是输出不符合预期的根源。
快速修复:给每行创建独立的Vector
把初始化逻辑改成这样,每次循环都新建一个Vector,保证每行都是独立的对象:
int n = 9; // 初始化矩阵:每行都是全新的Vector for(int j = 0; j < n*n; j++){ Vector<Integer> tmpMatrix = new Vector<Integer>(); for(int i = 0;i < n;i++){ tmpMatrix.addElement(-1); } matrix.addElement(tmpMatrix); }
这样修改某一行时,就不会影响其他行的内容了。
更优雅的实现方案
考虑到Vector是Java早期的线程安全集合,性能比ArrayList差不少(除非你明确需要线程安全场景),同时可以简化逻辑让代码更易读:
这里用ArrayList替代Vector,并优化条件判断和初始化逻辑:
import java.util.ArrayList; import java.util.List; public class TestMatrix { private List<List<Integer>> matrix = new ArrayList<>(); public void matrixUpdate() { int n = 9; // 初始化矩阵:每行都是独立的ArrayList,默认填充-1 for (int i = 0; i < n * n; i++) { List<Integer> row = new ArrayList<>(); for (int j = 0; j < n; j++) { row.add(-1); } matrix.add(row); } // 按规则更新元素 for (int i = 0; i < n * n; i++) { int a = i / n; int b = i % n; List<Integer> currentRow = matrix.get(i); for (int j = 0; j < n; j++) { int c = j; // 合并条件,逻辑更清晰:不满足三个相等条件时设为99 if (!(a == b || b == c || a == c)) { currentRow.set(j, 99); } // 满足条件的话保持初始的-1,不用重复设置 } System.out.println(currentRow); } // 打印完整矩阵 System.out.println("\n完整矩阵:"); for (List<Integer> row : matrix) { System.out.println(row); } } public static void main(String[] args) { TestMatrix testMatrix = new TestMatrix(); testMatrix.matrixUpdate(); } }
优化点说明:
- 合并三个独立的
if条件为一个,代码更简洁,逻辑一目了然 - 利用初始化时的默认值
-1,只有需要修改的位置才设置为99,减少不必要的set调用 - 用
foreach遍历打印矩阵,代码更优雅易读 - 如果确实需要线程安全,可以把
ArrayList换成CopyOnWriteArrayList,或者继续保留Vector,但绝大多数业务场景下ArrayList足够用
内容的提问来源于stack exchange,提问作者Kiran_KKT
相关产品推荐
相关产品推荐

