java二维数组转置需手动遍历并新建目标数组,典型实现为int[][] transposed = new int[matrix[0].length][matrix.length];矩阵乘法前必须校验a[0].length == b.length,结果维度为a.length × b[0].length。

Java 二维数组转置必须手动遍历,没有内置函数
Java 没有类似 Python 的 zip() 或 .T 这种一行转置的语法,Arrays 工具类也不提供矩阵转置方法。你得自己控制行列索引交换——常见错误是直接复用原数组尺寸却忘了新建目标数组,导致 ArrayIndexOutOfBoundsException 或覆盖原数据。
典型场景:输入是 int[][] matrix,行数 m、列数 n,转置后应为 int[n][m]。别用 matrix.length 和 matrix[0].length 硬编码,空行会抛 NullPointerException。
- 先判空:
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) - 新建结果数组:
int[][] transposed = new int[matrix[0].length][matrix.length] - 双层循环:外层遍历列(新行),内层遍历行(新列),即
transposed[j][i] = matrix[i][j]
矩阵乘法要求左矩阵列数等于右矩阵行数,否则运行时报错
两个矩阵能相乘不是靠 try-catch 捕获,而是必须在计算前校验维度。常见错误是把 A * B 写成 A[i][k] * B[k][j] 却没检查 A[0].length == B.length,结果循环越界或算出全零——因为 k 范围错了。
乘法结果维度是 A.length × B[0].length,中间维度(A[0].length 和 B.length)必须严格相等。Java 不做隐式广播,也不报编译错误,只会在运行时数组越界或逻辑错误。
- 校验前先确保两边非空:
if (A == null || B == null || A[0].length != B.length) - 结果数组初始化:
int[][] C = new int[A.length][B[0].length] - 三重循环顺序固定:
i(A 行)、j(B 列)、k(公共维度),累加写成C[i][j] += A[i][k] * B[k][j]
嵌套循环性能敏感:避免在内层重复取数组长度
写 for (int i = 0; i 看似自然,但若放在三层循环最内层,每次迭代都触发一次字段读取和边界检查。对大矩阵(比如 1000×1000),这可能多出百万级冗余操作。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
更糟的是,有人把 matrix[0].length 放进最内层循环条件,一旦某行为空或不等长,就直接崩掉——而这不是设计意图,只是低级失误。
- 提前缓存长度:
int rows = A.length, cols = B[0].length, mid = A[0].length - 所有循环条件用变量,如
for (int i = 0; i - 别依赖“矩阵一定是规则的”假设;生产代码里要加
for循环内对A[i]是否为null的检查(除非业务明确保证)
用 int[][] 还是封装类?简单运算别过早抽象
有人一上来就写 Matrix 类,加 transpose() 和 multiply() 方法,结果发现连基本索引越界都没处理好,反而掩盖了维度逻辑问题。对于教学、脚本或一次性计算,裸 int[][] 更直接,也更容易调试。
真正需要封装,是当你反复做行列切片、带步长访问、或需支持稀疏存储时。普通转置和乘法,加一层对象只是增加 null 判断和 getter 调用开销,没实际收益。
- 如果真要用类,别让构造函数接受
int[][]后直接引用——应深拷贝,否则外部修改原数组会影响实例状态 -
toString()打印时注意换行和对齐,别用Arrays.deepToString()直接输出,它不体现矩阵结构 - 测试时优先用小尺寸(2×3、3×2)验证维度逻辑,再扩到大数组看性能
事情说清了就结束。矩阵运算的坑不在算法,而在维度管理——少一个 length 缓存,或多一层空值假设,就足够让结果错得毫无征兆。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










