救助:字符串对比的问题。StringBuffer 和 String 的不同!
public class Palindrome {
public static void main(String [] args){
Palindrome Pa = new Palindrome();
boolean flag = Pa.test(args[0]);
if (flag){
System.out.println( "字符串是 Palindrome! ");
}else{
System.out.println( "字符串不是 Palindrome! ");
}
}
/**
* 下面是我自己写的方法,各位大侠,为什么String strReverse = str.reverse().toString();句必须要转换为String的啊!
* StringBuffer 和 StringBuffer 之间的比较 同 String 和 Sting 之间的比较有什么不同?
* 我还是新手,不明白为什么 StringBuffer 之间比较的时候就会出错!!
*/
public boolean test(String strOriginal){
StringBuffer str = new StringBuffer(strOriginal);
System.out.println( "Palindrome 的输入结果是: " + str);
String strReverse = str.reverse().toString();
System.out.println( "Palindrome 的对比结果是: " + str);
/**
* StringBuffer 之间的比较
*/
// if(str.equals(str.reverse())){
// return true;
// }else{
// return false;
// }
/**
* String 之间的比较
*/
if (strReverse.equals(strOriginal)){
return true;
}else{
return false;
}
}
}
------解决方案--------------------String是固化的字符串,任何改变字符串内容的操作(如上面的reverse)结果都是产生一个新的String对象,而不是改变当前String对象本身。
StringBuffer是一个字符串缓冲,任何改变字符串内容的操作(如上面的reverse)都可能对当前StringBuffer对象的内容生成改变。
因此,你的str.reverse()的时候,实际是str的内容已经改变成反序的字符串了。StringBuffer的reverse会返回自身,这在文档里写得清清楚楚
Returns:
a reference to this object
你可以简单的做一个试验:
System.out.println( "之前: " + str);
str.reverse();
System.out.println( "之后: " + str);
这样就能看到str的改变。
------解决方案--------------------StringBuffer没有自己的equals方法,用的是Object的equals方法,也就是用==比较两者是否为同一个对象。所以StringBuffer不要直接用equals比较,而要换成String之后,用equals比较。
------解决方案--------------------z_lping(Schemer) 说是对,举例如下:
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer( "abcd ");
StringBuffer b = new StringBuffer( "dcba ");
b.reverse();
System.out.println(a);
System.out.println(b);
System.out.println(a.equals(b));
System.out.println(a.toString().equals(b.toString()));
}
}
输出结果
abcd
abcd
false
true
明明a和b的内容都是abcd但是a.equals(b)就是为false,而toString()之后再equals就是true。