String、StringBuffer和StringBuilder

[size=small]StringBuffer 线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,则建议使用 StringBuffer 。
1. 为了获得更好的性能,在构造 StirngBuffer 或 StirngBuilder 时应尽可能指定它的容量。当然,如果你操作的字符串长度不超过 16 个字符就不用了。
2. 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非你能确定你的系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,否则还是用 StringBuffer。
3. 用好现有的类比引入新的类更重要。很多程序员在使用 StringBuffer 时是不指定其容量的,如果这样的习惯带入 StringBuilder 的使用中,你将只能获得 10 %左右的性能提升;但如果你使用指定容量的 StringBuffer,你将马上获得 45% 左右的性能提升,甚至比不使用指定容量的 StirngBuilder 都快 30% 左右。
以下是关于String、StringBuffer和StringBuilder的几点总结:
1. String对象是不可变的,但String引用变量不是;
2. 如果创建了新的String而没有给它赋值,则对程序来说它将丢失;
3. 如果将String引用重定向到新的String,则旧的String可能丢失;
4. 除了substring()的第二个参数外,String方法使用基于0的索引;
5. String类是最终类——其方法不能被重写;
6. 当JVM发现String字面值时,就将它添加到String字面值池中(字符串常量池);
7. String有一个名为length()的方法,数组有一个名为length的属性;
8. StringBuffer的API与新的StringBuilder的API相同,但是StringBuffer的方法并未针对线程安全进行同步;
9. StringBuilder的方法应该运行得比StringBuffer的方法更快;
10. 以下列出的各项同时适用于StringBuilder和StringBuffer:
10.1. 它们都是可变的——无需创建新对象即可改变它们;
10.2. StringBuffer方法作用于调用对象上,无需在语句中显式赋值即可改变对象;
10.3. StringBuffer的equals()没有方法被重写,它不比较值;
11. 链式方法是从左到右计算的。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值