主要从三个方面谈这三个类的区别:
- 可变性
- 线程安全性
- 性能
可变性
String为什么是不可变的?
String内部实现其实是private final char value[]
, 所以String对象是不可变的.
StringBuilder与StringBuffer都继承自AbstractStringBuilder类.
AbstractStringBuilder是用char[] value
来存储字符串的, 但是没有用final关键字, 所以StringBuilder和StringBuffer对象都是可变的.
线程安全性
String中的对象是不可变的, 可以理解成常量, 是线程安全的.
AbstractStringBuilder是StringBuilder和StringBuffer的公共父类, 定义了一些字符串的操作方法, 如常用的append用于字符串拼接, indexOf用于字符串查找等.
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁, 所以是线程安全的.
而StringBuilder并没有对方法家同步锁, 所以是非线程安全的.
性能
对于String对象而言, 每次都会生成一个新的String对象, 然后将指针指向新的String对象.
StringBuffer和StringBuilder每次都会对对象本身进行操作, 而不是生成新的对象并且改变对象的引用. 相同情况下使用StringBuilder会比StringBuffer获得10%-15%的性能提升, 但是要承担多线程不安全的风险.
总结
少量数据用String
单线程大量数据用StringBuilder
多线程大量数据用StringBuffer