为什么会有这个问题呢?首先得看看String和StringBuffer的比较区别:

==只能比较两个字符串的内存地址是否一样,不能比较字符串内容;

String的equals方法因为重写了Object的equals方法,所以可以比较字符串的内容,而StringBuffer因为没重写equals方法,直接继承了Object的equals方法,所以不行。

顺便提一句:String因为是final类型的,是不可变类,所以对于append等操作,是要重新new String的,而StringBuffer是可变类,不需要重新new StringBuffer,所以在字符串操作上性能非常好,而且好的不是一点点。可试试:



1 public static void main(String[] args) {
2 StringBuffer s1 = new StringBuffer();
3 String s2 = new String();
4
5 Date d = new Date();
6 long a = d.getTime();
7 for (int i = 0; i < 100000; i++) {
8 s1.append(i);
9 }
10 Date d2 = new Date();
11 long b = d2.getTime();
12 System.out.println(b-a);
13
14 Date d3 = new Date();
15 a = d3.getTime();
16 for (int i = 0; i < 100000; i++) {
17 s2 = s2 + i;
18 }
19 Date d4 = new Date();
20 b = d4.getTime();
21 System.out.println(b-a);
22 }


 

 

 

那么如何比较StringBuffer字符串内容是否相等呢?

可以使用toString() 方法将StringBuffer的内容转换为String 字符串,再使用equals()方法比较。



1 public class Main {
2 public static void main(String[] args) {
3 StringBuffer strb1 = new StringBuffer("Java");// 创建StringBuffer对象str1
4 StringBuffer strb2 = new StringBuffer("Java");// 创建StringBuffer对象str2
5 System.out.println("****不使用toString()方法****");
6 if (strb1.equals(strb2)) {
7 System.out.println("相等");
8 } else {
9 System.out.println("不相等");
10 }
11 System.out.println("****使用toString()方法****");
12 if (strb1.toString().equals(strb2.toString())) {
13 System.out.println("相等");
14 } else {
15 System.out.println("不相等");
16 }
17 }
18 }