String、StringBuffer和StringBuilder的区别
String、StringBuffer和StringBuilder的区别
[简书文章]:String、StringBuffer和StringBuilder的区别
联系与区别
- 三者都是
final
类,都不允许被继承; String
类长度是不可变的,而StringBuffer
和StringBuilder
类长度是可变的;StringBuffer
类使线程安全的,StringBuilder
类不是线程安全的。
String
String
是不可变的对象,因此每次对String
类进行改变的时候,都会生成一个新的对象,然后将指针指向新的对象;- 当需要多次改变字符串长度时,不建议使用
String
,因为每次生成对象都会对系统性能产生影响,特别是当内存中引用的对象多了以后,JVM的GC就会开始工作,性能就会降低。
StringBuffer
StringBuffer
是可变对象,每次都是对StringBuffer
对象本身 进行操作,而不是生成新的对象并改变对象的引用,因此大部分情况下建议使用StringBuffer
,特别是字符串对象经常要改变的时候。
StringBuilder
StringBuilder
是5.0新增的,此类提供一个与StringBuffer
兼容的API,但不保证同步;- 该类被设计作为
StringBuffer
的一个简易替换,用在字符串缓冲区被当个线程使用的时候(这种情况很普遍); - 如果可能,建议优先使用该类,因为在大多数实现中,他比
StringBuffer
更快,但两者方法基本相同。
使用策略
-
基本原则
- 操作少量的数据,用
String
; - 单线程操作大量数据,用
StringBuilder
; - 多线程操作大量数据,用
StringBuffer
(线程安全);
- 操作少量的数据,用
-
不要使用
String
类的“+”来进行频繁的拼接,因为这样性能极差,应该使用StringBuffer
或StringBuilder
类,这在Java的优化上是一条比较重要的原则。String result = ""; for (String s : hugeArray) { result = result + s; } // 使用StringBuilder StringBuilder sb = new StringBuilder(); for (String s : hugeArray) { sb.append(s); } String result = sb.toString();
-
StringBuilder
一般使用在方法内部来完成类似“+”的功能,因为它是非线程安全的,所有用完以后可以丢弃; -
StringBuffer
只要用于全局变量中; -
相同情况下使用
StirngBuilder
相比使用StringBuffer
仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在StringBuffer
上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder
;否则还是用StringBuffer
.