You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用字符数组反转字符串出现错误输出的原因分析

为啥字符串反转后输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:03:10