String和StringBuilder平级,因为它们都是可变和线程安全二选一,可变就线程不安全,线程安全就不可变,鱼和熊掌不可兼得
但是StringBuffer就是比他们两都更高一级,既是可变的也是线程安全的,二者兼得
1.String是不可变的,StringBuilder和StringBuffer是可变的
2.String类的对象是不可变的,可以理解为常量,是线程安全的
StringBuilder
并没有对方法进行加同步锁,所以是非线程安全的
StringBuffer
对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
总结:只有StringBuilder是线程不安全的,其他两个是线程安全的
3.每次对 String
类型进行改变的时候,都会生成一个新的 String
对象,然后将指针指向这个新的 String
对象
StringBuffer
每次都会对 StringBuffer
对象本身进行操作
相同情况下使用 StringBuilder
相比使用 StringBuffer
仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
可变还是不可变 | 是否线程安全 | 速度快不快 | |
String | 不可变 | 安全 | 慢 |
StringBuffer | 可变 | 安全 | 稍微快一点 |
StringBuilder | 可变 | 不安全 | 最快(但是只比StringBuffer快10%~15%,却要从线程安全变成线程不安全) |