判断字符串"nitin"是否为回文返回false,请求技术排查解决
问题排查与修复:回文判断返回false的原因
嘿,我一眼就瞅出问题所在啦——你这段代码判断回文返回false,核心问题出在StringBuffer的equals方法行为上,咱们拆解来看:
为什么会返回false?
你代码里的sb是StringBuffer对象,rev是从sb转来的String对象。注意:StringBuffer继承自Object,它的equals()方法默认是比较对象的内存引用,而不是字符串内容!哪怕两个对象的字符内容完全一致,只要不是同一个对象实例,equals就会返回false。更别说你这里一个是StringBuffer,一个是String,类型都不同,肯定不相等呀。
修复方案
给你两种简单的修复方式,任选其一就行:
方案1:将StringBuffer转为String后再比较
既然rev已经是String类型,咱们把sb也转成String再用String的equals方法(这个方法是比较内容的):
public static void main(String[] args) { StringBuffer sb = new StringBuffer("nitin"); sb.reverse(); String rev = sb.toString(); System.out.println(sb); System.out.println(rev); // 修复点:把sb转成String再比较 if (sb.toString().equals(rev)) { System.out.println("true"); } else { System.out.println("false"); } }
甚至可以更简洁,直接和原字符串比较,避免多余的变量:
public static void main(String[] args) { String original = "nitin"; String rev = new StringBuffer(original).reverse().toString(); System.out.println(original); System.out.println(rev); if (original.equals(rev)) { System.out.println("true"); } else { System.out.println("false"); } }
方案2:使用StringBuffer的contentEquals方法
StringBuffer提供了专门用来比较内容的contentEquals()方法,它可以直接和String对象比较内容,不用转类型:
public static void main(String[] args) { StringBuffer sb = new StringBuffer("nitin"); sb.reverse(); String rev = sb.toString(); System.out.println(sb); System.out.println(rev); // 修复点:用contentEquals比较内容 if (sb.contentEquals(rev)) { System.out.println("true"); } else { System.out.println("false"); } }
额外小技巧(Java 11+)
如果你的Java版本是11及以上,String类直接提供了reverse()方法,写起来更清爽:
public static void main(String[] args) { String original = "nitin"; String rev = original.reverse(); System.out.println(original); System.out.println(rev); System.out.println(original.equals(rev) ? "true" : "false"); }
内容的提问来源于stack exchange,提问作者Akp
相关产品推荐
相关产品推荐

