今天在处理字符串的比较时,要判断一个字符串是否是回文串,即对称的字符串,我的想法是反转字符串,再与反转前的比较,如果一样则为回文串,代码如下:
StringBuilder builder = new StringBuilder("12345");
// 反转字符串
String reverse = builder.reverse().toString();
boolean res = builder.toString().equals(reverse);
System.out.println("res==" + res);
但是输出却不对,很明显“12345”不是回文串,但是输出:
res==true
原因在哪里呢,原本我以为是什么常量池的问题,但是打log及看了源码才发现, 原来builder的reverse()返回的是this,也就是builder对象自己,也就是说第二行代码builder.reverse()执行完后,builder的值就已经变成反转后的值了。这样比较结果当然是true。
把上面的代码改一下:
StringBuilder builder = new StringBuilder("12345");
String str = builder.toString(); //记录反转前的值
//反转后的值
String reverse = builder.reverse().toString();
boolean res = str.equals(reverse); //这里改为str
System.out.println("res==" + res);
输出就与预期一致了:
res==false