Java实现字符串反转时char类型swap辅助函数未按预期生效问题
失效原因
- Java的基本数据类型(char、int、boolean等)参数传递采用值传递机制:调用方法时传入的是实际参数值的拷贝,不是参数本身的引用。
- 现有
swap(char a, char b)方法被调用时,JVM会把s[left]、s[right]对应的字符值复制一份,赋值给方法内的局部变量a和b。方法内部交换的只是这两个局部拷贝的值,完全不会影响原数组中存储的元素,方法执行结束后局部变量被回收,原数组没有任何改动。 - 把交换逻辑直接写在while循环中能生效,是因为此时直接通过数组索引操作原数组内存空间里的元素,修改会直接作用在原数组上,不存在值拷贝的隔离问题。
修正方案
方案1:调整swap方法参数,直接操作数组元素
把字符数组、需要交换的两个索引位置作为swap方法的入参。由于数组是引用类型,方法接收到的是数组对象的引用,通过索引修改数组元素时会直接作用在原数组上:
class Solution { public void reverseString(char[] s) { int left = 0; int right = s.length - 1; while (left < right) { swap(s, left, right); left++; right--; } } private void swap(char[] arr, int i, int j) { char temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
方案2:不抽离独立swap方法,直接在循环内完成交换
这是已经验证可用的写法,逻辑更直接,没有额外方法调用的开销:
class Solution { public void reverseString(char[] s) { int left = 0; int right = s.length - 1; while (left < right) { char temp = s[left]; s[left] = s[right]; s[right] = temp; left++; right--; } } }
注意:Java不存在对基本数据类型的引用传递,所以不可能写出可以直接交换两个传入的char类型变量值的swap方法,必须通过持有数组/对象的引用、修改内部成员的方式实现交换效果。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

