为什么Java中不等的原字符串与反转字符串比较返回true?
问题原因解析
StringBuilder属于可变字符序列,它的reverse()方法是原地修改当前对象内部存储的字符内容,且方法返回值就是当前对象自身的引用,不会生成新的StringBuilder实例,这是问题出现的核心原因:
- 执行
StringBuilder stringReverse = string.reverse();时,调用reverse()会直接把string指向的对象内容从abb修改为bba,同时返回的引用直接赋值给stringReverse,最终string和stringReverse指向的是完全相同的StringBuilder对象 - 后续调用
string.toString()和stringReverse.toString(),本质是对同一个对象做内容序列化,得到的字符串完全一致,因此equals比较返回true
正确实现回文判断的代码示例
如果要得到预期的判断结果,需要先保存原字符串的内容,再执行反转操作,修改后的代码如下:
public class Main { public static void main(String[] args) { StringBuilder string = new StringBuilder("abb"); // 先存储未被修改的原字符串内容 String originalContent = string.toString(); // 执行反转并得到反转后的字符串 String reversedContent = string.reverse().toString(); if(originalContent.equals(reversedContent)){ System.out.println(true); return; } System.out.println(false); } }
上述代码运行后会输出你预期的false。
内容的提问来源于stack exchange,提问作者Akshay Ravichandran
相关产品推荐
相关产品推荐

