Java中String,StringBuilder, StringBuffer区别

发布时间 2023-07-21 09:36:04作者: codemcr

1.可变性

String是不可变的字符序列:String类中使用字符数组保存字符串,因为有“final”修饰符,所以String是不可变的

StringBuffer和StringBuilder是可变的字符序列,由于继承了AbstractStringBuilder父类,他们的属性也都相同,是可变字符序列

2.线程安全性

由于String是被final修饰的不可变序列,所以String是线程安全的
StringBuffer和StringBuilder虽都继承了AbstractStringBuilder父类,方法相同,但StringBuffer在方法上加synchronized关键字,对方法加了同步锁或者对调用的方法加了同步锁,所以StringBuffer是线程安全的
StringBuilder不保证同步,字符串运算方法不是同步的,用于在单线程下做StringBuffer的替代品,所以StringBuilder是线程不安全的

3.性能方面

一般情况下(单线程),StringBuilder > StringBuffer > String
由于StringBuffer要给方法加同步锁的原因,所以StringBuilder要慢一些
String频繁修改对象,会产生大量的新的对象,浪费资源
特殊情况例如:

String s1="123"+"456"+"789";        //实际相当于String s1="123456789";
StringBuilder s2=new StringBuilder("123");    //StringBuilder不断地append追加会慢于String
s2.append("456").append("789")

4.存储方面

String类型存储在常量池中,StringBuffer和StringBuilder存储在堆中
StringBuilder和StringBuilder操作时都是返回的他本身,而不是产生新对象,

补充:

相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用 StringBuilder;否则还是用 StringBuffer。
StringBuilder提供与StringBuffer兼容的API,但是不保证同步,此类设计用于在单线程下做StringBuffer的替代品,单线程情况下,简易优先使用此类而不是StringBuffer,因为它的字符串运算方法不是同步的