顺时针旋转90°的核心是“转置+每行反转”:先交换matrixi与matrixj实现转置,再对每行元素反转,逻辑清晰、易实现且安全。

Java 中二维数组矩阵旋转的核心在于理解坐标变换规律,而不是单纯套用公式。顺时针旋转 90° 最常用,关键在于“转置 + 水平翻转”,既清晰又易实现;逆时针或其它角度可由此推导,避免硬记坐标映射。
顺时针旋转 90°:两步法最稳妥
原地旋转虽节省空间,但逻辑复杂易出错;新建数组实现更直观、安全,适合大多数业务场景。推荐采用“先转置,再每行反转”策略:
- 转置(Transpose):将 matrix[i][j] 与 matrix[j][i] 交换,即行列互换,要求 i
- 水平翻转(Reverse each row):对每一行调用 Arrays.sort() 不适用,应手动首尾交换,索引范围为 0 到 row.length/2 - 1
示例:3×3 矩阵转置后变为对称形式,再反转每行,自然得到顺时针 90° 结果。该方法时间复杂度 O(n²),空间 O(1)(原地)或 O(n²)(新建)。
逆时针旋转 90°:复用逻辑更可靠
不必重写一套坐标计算——三次顺时针 90° 等价于一次逆时针 90°,但效率低;更优方式是“转置 + 垂直翻转(即每列反转)”,或直接“先垂直翻转,再转置”。两种等价,推荐后者:
立即学习“Java免费学习笔记(深入)”;
- 先上下翻转:交换第 i 行与第 (n-1-i) 行,i 范围为 0 到 n/2 - 1
- 再转置:同上,保持 i
这样避免了手算新坐标可能引入的 off-by-one 错误,也便于单元测试验证。
通用旋转(任意角度):按 90° 倍数归一化
矩阵旋转只在 90° 整数倍有意义(否则需插值,属图像处理范畴)。输入角度如 270°、-90°、360°,应先取模归一化:
- angle = ((angle % 360) + 360) % 360 → 统一为 0°、90°、180°、270°
- 0°:原样返回;180°:双重翻转(水平 + 垂直),或直接倒序遍历;270° 即逆时针 90°,走前述路径
封装时建议用 switch 或查表映射,而非 if-else 堆叠,提升可读性与扩展性。
边界与空值处理:上线前必须校验
生产代码中,null、空数组、非矩形数组(如 int[][] arr = {{1},{2,3}})极易引发 ArrayIndexOutOfBoundsException 或 NullPointerException:
- 开头检查:if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
- 一致性校验:遍历 matrix[i],确认每行长度等于 matrix[0].length,不等则抛 IllegalArgumentException
- 方阵非必需:m×n 矩阵顺时针旋转后变为 n×m,新建数组时注意 new int[matrix[0].length][matrix.length]
这些判断不到十行,却能拦截多数集成环境下的崩溃,比事后 debug 快得多。


















