【JAVA踩坑】StringBuffer的equals方法(力扣125.验证回文串)

目录

踩坑复现

题目

踩坑代码

踩坑描述:

踩坑分析

拓展思考


踩坑复现

题目

踩坑代码

踩坑描述:

踩坑分析

拓展思考


踩坑复现

题目

力扣 125. 验证回文串

踩坑代码

class Solution {
    public boolean isPalindrome(String s) {
        char[] c = s.toLowerCase().toCharArray();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<c.length;i++)
            if(c[i]>='a'&&c[i]<='z'||c[i]>='0'&&c[i]<='9')//判断是否为字母或数字
                sb.append(c[i]);
        if(sb.length()==0) return true;
//下一行踩坑
        if(sb.equals(sb.reverse())) return true;
        return false;
    }
}

踩坑描述:

在测试用例中输入任何值,都返回true,但经过检查代码逻辑没有问题,于是认为问题出在某些方法上。

28194c0b25cc4774b9be08b8f08baa09.png73ddc46f087f48dcba941fbe739a1faa.png9d6c262cd0a14cd5b5e60c14f09a32e1.png

最终定位到问题出在equals方法上

if(sb.equals(sb.reverse())) return true;

踩坑分析

在测试用例中输入任何值都会返回true,则表明equals方法比较的很可能不是可变字符串中的内容是否一致,而是比较其类型是否一致,经过查阅资料得出以下结论:

equals方法属于Object类,而StringBuffer并没有重写equals方法,则在StringBuffer对象使用equals方法时,会调用Object类下的equals方法。

而Object类下的equals方法代码如下

public boolean equals(Object obj) {
        return (this == obj);
    }

由代码可以得知,如果不重写equals方法,则其比较的是类型是否相等

这就可以解释为什么测试样例取任意值,返回值始终为true,因为比较的两者都是StringBuffer类型。

拓展思考

既然StringBuffer不能用equals方法,那String对象为何又可以使用equals方法呢?

通过刚刚的分析,我们可以猜测String类应该是对equals方法进行了重写。

通过查看Java源码,可以证实我们的猜测:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值