读书人

救助:字符串对比的有关问题。StringB

发布时间: 2012-01-02 22:40:04 作者: rapoo

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

读书人网 >J2SE开发

热点推荐