为何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方法,核心是比较两个字符串的内容是否一致。
这段代码的执行流程是:- 第一次调用
s.toString(),此时StringBuilder的内容是"abcd",得到字符串"abcd"; - 调用
s.reverse(),原StringBuilder的内容被修改为"dcba",同时返回自身引用; - 再次调用
toString(),得到的是修改后的内容"dcba"; - 最后执行
"abcd".equals("dcba"),内容完全不同,因此返回false。
- 第一次调用
内容的提问来源于stack exchange,提问作者Pavni
相关产品推荐
相关产品推荐

