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

发布于:2023-01-20 ⋅ 阅读:(8) ⋅ 点赞:(0) ⋅ 评论:(0)

目录

踩坑复现

题目

踩坑代码

踩坑描述:

踩坑分析

拓展思考


踩坑复现

题目

踩坑代码

踩坑描述:

踩坑分析

拓展思考


踩坑复现

题目

力扣 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源码,可以证实我们的猜测: