数组倒序翻转与位置交换本质相同,均通过双指针交换对称元素实现;倒序原地操作空间复杂度o(1),适用于所有类型数组;字符串或对象数组交换的是引用而非内容;collections.reverse()仅支持list,不适用于基本类型数组。

Java 中数组倒序翻转和位置交换本质是同一类操作:通过索引控制,交换对称位置的元素。核心思路是用双指针(首尾向中间靠拢),每轮交换一对元素,直到指针相遇。
倒序翻转一维数组(原地修改)
适用于 int[]、String[] 等任意引用或基本类型数组,不创建新数组,空间复杂度 O(1)。
- 定义两个索引:left 从 0 开始,right 从
array.length - 1开始 - 循环条件:
left (等于时无需交换,奇数长度中间元素不动) - 每次循环中交换
array[left]和array[right],然后left++、right--
示例代码:
int[] arr = {1, 2, 3, 4, 5};
for (int left = 0, right = arr.length - 1; left <h3>交换任意两个指定位置的元素</h3><p>这是翻转的最小单元操作,常用于排序、随机打乱等场景。注意需校验索引合法性,避免 ArrayIndexOutOfBoundsException。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img
src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a>
<p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
- 先检查
i和j是否在[0, array.length)范围内 - 若合法,用临时变量交换(基本类型)或直接赋值(引用类型也可用同一方式)
- 无需关心 i 是否小于 j,交换逻辑对称
封装成方法更安全:
public static void swap(int[] arr, int i, int j) {
if (i = arr.length || j = arr.length) {
throw new IllegalArgumentException("Index out of bounds");
}
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
针对字符串数组或对象数组的注意事项
倒序逻辑完全相同,但要注意 String 是不可变对象——交换的是数组中存储的引用,不是修改字符串内容本身。
- 对
String[] strs = {"a", "b", "c"}执行翻转,结果是{"c", "b", "a"},每个字符串值不变,只是位置变了 - 若需反转每个字符串内部字符(如把 "hello" 变成 "olleh"),那是另一层操作,需对每个元素单独调用 StringBuilder.reverse()
- 自定义对象数组同理,swap 或 reverse 改变的是引用顺序,不影响对象自身状态
使用 Collections.reverse() 的前提与限制
该方法只能用于 List,不能直接作用于普通数组。如需借助它,得先将数组转为 List(注意基本类型数组不支持自动装箱)。
- 对于
Integer[]:可用Arrays.asList(arr)转换后调用Collections.reverse() - 对于
int[]:必须手动包装为Integer[],或改用 Stream 流式处理(会生成新数组) - 该方式产生额外对象,且非原地操作,性能和内存开销高于双指针法
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










