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

为何StringBuilder调用reverse()后equals判断结果不符合预期?

问题解析:StringBuilder equals与toString后equals的结果差异

问题场景

以下两段代码执行结果截然不同,具体原因是什么?

// 第一段代码
StringBuilder s= new StringBuilder();
s.append("abcd");
System.out.println(s.equals(s.reverse()));
// 输出:true

// 第二段代码
StringBuilder s= new StringBuilder();
s.append("abcd");
System.out.println(s.toString().equals(s.reverse().toString()));
// 输出:false

原因分析

  • 第一段代码:StringBuilder.equals()的本质
    StringBuilder没有重写equals方法,直接继承了Object类的默认实现——只比较两个对象的内存地址是否相同。
    而reverse()方法的特性是:它会直接修改当前StringBuilder对象的内容,并且返回的是当前对象的引用(也就是this)。所以s和s.reverse()指向的是同一个内存地址,调用equals自然返回true。

  • 第二段代码:String.equals()的逻辑
    String类重写了equals方法,核心是比较两个字符串的内容是否一致。
    这段代码的执行流程是:

    1. 第一次调用s.toString(),此时StringBuilder的内容是"abcd",得到字符串"abcd";
    2. 调用s.reverse(),原StringBuilder的内容被修改为"dcba",同时返回自身引用;
    3. 再次调用toString(),得到的是修改后的内容"dcba";
    4. 最后执行"abcd".equals("dcba"),内容完全不同,因此返回false。

内容的提问来源于stack exchange,提问作者Pavni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:32:36