目录
踩坑复现
题目
力扣 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,但经过检查代码逻辑没有问题,于是认为问题出在某些方法上。
最终定位到问题出在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源码,可以证实我们的猜测:
本文含有隐藏内容,请 开通VIP 后查看