日期:2014-05-20  浏览次数:20605 次

救助:字符串对比的问题。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。