String 与 StringBuffer解析(三)

2014-11-24 10:26:46 · 作者: · 浏览: 3
le, CharSequence
public final class StringBuffer implements Serializable, CharSequence
很明显的,小弟少了一些东东,不过这不会干扰它的前途
StringBuffer 不是由 String 继承来的,不过要注意兄弟它也是 final 啊,本是同根生
看看他的方法吧,这么多稳定可靠的方法,用起来比顽皮的 String 要有效率的多
Java 为需要改变的字符串对象提供了独立的 StringBuffer 类
它的实例不可变(final),之所以要把他们分开是因为,字符串的修改要求系统的开销量增大,占用更多的空间也更复杂,相信当有10000人挤在一个狭小的游泳池里游泳 而岸边又有10000人等待进入游泳池而焦急上火 又有10000人在旁边看热闹的时候,你这个 String 游泳池的管理员也会焦头烂额
在你无需改变字符串的情况下,简单的 String 类就足够你使唤的了,而当要频繁的更改字符串的内容的时候,就要借助于宰相肚里能撑船的StringBuffer 了

5. 宰相肚里能撑船
(1) length() 与 capacity()
String 中的 length() 返回字符串的长度,兄弟 StringBuffer 也是如此,他们都由对象包含的字符长度决定 capacity()呢?
public class TestCapacity {
public static void main(String[] args){
StringBuffer buf = new StringBuffer("it was the age of wisdom,");
System.out.println("buf = " + buf);
System.out.println("buf.length() = " + buf.length());
System.out.println("buf.capacity() = " + buf.capacity());
String str = buf.toString();
System.out.println("str = " + str);
System.out.println("str.length() = " + str.length());
buf.append(" " + str.substring(0,18)).append("foolishness,");
System.out.println("buf = " + buf);
System.out.println("buf.length() = " + buf.length());
System.out.println("buf.capacity() = " + buf.capacity());
System.out.println("str = " + str);
}
}
程序输出:
buf = it was the age of wisdom.
buf.length() = 25
buf.capacity() = 41
str = it was the age of wisdom
str.length() = 25
buf = it was the age of wisdom, it was the age of foolishness,
buf.length() = 56
buf.capacity() = 84
str = it was the age of wisdom,
可以看到,在内容更改之后,capacity也随之改变了
长度随着向字符串添加字符而增加
而容量只是在新的长度超过了现在的容量之后才增加
StringBuffer 的容量在操作系统需要的时候是自动改变的
程序员们对capacity所能够做的仅仅是可以在初始化 StringBuffer对象的时候,为它强行的分配一个固定的capacity,但是之后,它愿不愿以改变就完全看自己的了,capacity 会随着 length 超出而改变,总之,它总是要比 length 大

5. 把好你的舵不要翻船
StringBuffer的胃口看起来很好啊,看起来似乎它可以随意的变成一艘航空母舰
不过请注意:
capacity 的每一次更改和变化,整个对象必须被重建并且移动到另外一个内存区,为了避免类似的溢出,最好在初始化的时候为他分配足够的容量
如果你是船长,在航行中突然下令:“我们准备弃船,换另外一艘大船去啦!”,你的水手们怎么想?“让我们自杀吗?”,所以出发前尽量准备一艘合适的船,不要超载,也不要太大,千万不要在中途翻船啊!
StringBuffer 还有一个炫耀的调皮方法:reverse()
它可以让它肚子里面的东西反一个个儿

6. 大马吃小马
哦,天哪,String 和 StringBuffer 用谁都会使性子
应该如何是好呢?
(1)如果你的 String 仅出现极少数次,随他们去吧,毕竟草原很辽阔
(2)如果他们数目惊人混乱不堪挤作一团到处破坏,将他们 intern() ,学会游泳比淹死了强
另外配合着 StringBuffer 的使用,它很像这群乱马的头头可以舒舒服服的调教哪些野性的 String ,把他们头接尾、尾接头的组合起来形成一个团体,更容易控制和管理(不过令人沮丧的是它的编辑功能不太好)
不过要小心,虽然StringBuffer 的肚子很大,但是不要把它撑破了,适当的给它一个空间,它会发挥更好的作用
(2) 小心谨慎的对待 == 和 equals()
千万不要忘了本,他们都是对象
你可以用各种高效率的办法进行尝试(intern() 然后 ==)
但是在最终的原则上要把握好
(3) String 和 StringBuffer不可以互相使用 equals()
不要忘了他们不是同类