Java中使用char[]数组反转字符串出错的问题排查
为什么用char[]自身赋值反转字符串会出错?
当尝试用char数组自身赋值反转字符串时,输入'geeks'得到的结果是'skeks',而非预期的'skeeg';但将赋值语句改为reverseword[j] = test.charAt(i)就能得到正确结果。相关代码如下:
class reverse { public static String sample(String str) { String test = str; char[] reverseword; reverseword = test.toCharArray(); int j = 0; for (int i = reverseword.length - 1; i >= 0; i--) { reverseword[j] = reverseword[i]; j++; } String finalresult = new String(reverseword); return finalresult; } }
问题原因
核心问题是你在同一个char数组上同时进行读和覆盖写操作,前面的赋值会修改数组中的原始字符,导致后续循环读取到的不是最初的字符串内容。
拿输入'geeks'为例,初始char数组是['g','e','e','k','s'],循环执行过程如下:
- i=4(对应字符's'),j=0:将
reverseword[0]改为's',数组变为['s','e','e','k','s'] - i=3(对应字符'k'),j=1:将
reverseword[1]改为'k',数组变为['s','k','e','k','s'] - i=2(对应字符'e'),j=2:将
reverseword[2]改为'e',数组无变化 - i=1(此时数组中
reverseword[1]已经是'k',而非原始的'e'),j=3:将reverseword[3]改为'k',数组无变化 - i=0(此时数组中
reverseword[0]已经是's',而非原始的'g'),j=4:将reverseword[4]改为's',数组无变化
最终数组内容是['s','k','e','k','s'],所以得到结果'skeks'。
而使用test.charAt(i)时,test是原始字符串,始终读取的是最初的字符,不会被数组的修改操作影响,因此能正确反转。
正确解决方法
方法1:创建新的char数组存储结果
避免在原数组上覆盖,直接用新数组保存反转后的字符:
class reverse { public static String sample(String str) { char[] reverseword = new char[str.length()]; int j = 0; for (int i = str.length() - 1; i >= 0; i--) { reverseword[j] = str.charAt(i); j++; } return new String(reverseword); } }
方法2:双指针交换两端字符
在同一个数组上操作,但通过交换两端字符的方式,不会覆盖未读取的原始内容:
class reverse { public static String sample(String str) { char[] reverseword = str.toCharArray(); int left = 0; int right = reverseword.length - 1; while (left < right) { // 交换左右指针指向的字符 char temp = reverseword[left]; reverseword[left] = reverseword[right]; reverseword[right] = temp; left++; right--; } return new String(reverseword); } }
内容的提问来源于stack exchange,提问作者Sreenath
相关产品推荐
相关产品推荐

