使用字符数组反转字符串出现错误输出的原因分析
为啥字符串反转后输出
dloold而不是dlorah? 嘿,这个问题我刚学Java的时候也踩过一模一样的坑!咱们先揪出核心问题,再一步步拆解错误是怎么发生的。
问题根源:数组引用的“隐形陷阱”
你写的char c2[] = c;这行代码根本不是创建新数组,而是把c2变成了原数组c的引用——简单说就是,c和c2指向内存里的同一个数组!所以你修改c2[i]的时候,其实也在偷偷修改原数组c的元素,后面循环里取c[j-i-1]的时候,拿到的已经是被篡改后的值了。
模拟循环过程(以"harold"为例)
原数组c初始是:['h','a','r','o','l','d'],长度j=6。咱们一步步看循环执行后的变化:
- i=0:
c2[0] = c[5]→ 数组变成['d','a','r','o','l','d'] - i=1:
c2[1] = c[4]→ 数组变成['d','l','r','o','l','d'] - i=2:
c2[2] = c[3]→ 数组变成['d','l','o','o','l','d'] - i=3:
c2[3] = c[2]→ 此时c[2]已经被改成'o'了,赋值后数组还是['d','l','o','o','l','d'] - i=4:
c2[4] = c[1]→c[1]是'l',数组无变化 - i=5:
c2[5] = c[0]→c[0]是'd',数组无变化
最后输出的就是这个被中途修改过的数组:dloold。
正确的实现方式
要解决这个问题,你需要真正创建一个新数组来存储反转结果,而不是直接引用原数组:
String a = "harold"; char[] c = a.toCharArray(); int j = c.length; // 新建一个和原数组长度相同的空数组 char[] c2 = new char[j]; for(int i = 0; i < j; i++){ c2[i] = c[j - i - 1]; } System.out.println(c2); // 输出dlorah
或者更高效的方式——直接在原数组上用双指针交换元素,不需要额外数组:
String a = "harold"; char[] c = a.toCharArray(); int left = 0; int right = c.length - 1; while(left < right){ // 交换左右指针的元素 char temp = c[left]; c[left] = c[right]; c[right] = temp; left++; right--; } System.out.println(c); // 输出dlorah
内容的提问来源于stack exchange,提问作者woww
相关产品推荐
相关产品推荐

