//先看看这段代码的输出是不是与想的一样,嘿嘿~ public static void main(String[] args) { StringBuffer sb1 = new StringBuffer("aaa"); StringBuffer sb2 = new StringBuffer("aaa"); // StringBuilder sb1 = new StringBuilder("aaa"); // StringBuilder sb2 = new StringBuilder("aaa"); System.out.println("sb1 == sb2:" + (sb1 == sb2) ); System.out.println("sb1 eq sb2:" + (sb1.equals(sb2)) ); System.out.println("sb1.capacity():" + sb1.capacity()); System.out.println("sb2.capacity():" + sb2.capacity()); System.out.println("sb1.length():" + sb1.length()); System.out.println("sb2.length():" + sb2.length()); System.out.println("sb1.toString():" + sb1.toString()); System.out.println("sb2.toString():" + sb2.toString()); }
看看java文档才发现,StringBuilder和StringBuffer都没有overriding方法:equals,原来如此!
默认的equals方法在Object中,返回 == 得到的结果。
既然sun要用StringBuilder和StringBuffer来辅助不可变的String,为何丢弃此方法呢?
看来equals方法使用时,一定要看文档,尤其是不熟悉的类,“想当然”是会犯错的~
-------------------------------------
另外文章http://www.blogjava.net/lsbwahaha/archive/2009/04/22/267038.html
写了String,StringBuffer,StringBuilder三者的区别:
Java.lang.StringBuffer 线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,则建议使用 StringBuffer 。
结论:基本来说都是在性能上都是 StringBuilder > StringBuffer > String
------------------------------------------
代码输出:
sb1 == sb2:false
sb1 eq sb2:false
sb1.capacity():19
sb2.capacity():19
sb1.length():3
sb2.length():3
sb1.toString():aaa
sb2.toString():aaa