String、StringBuffer以及StringBuilder都是对字符串进行操作,但是他们也有不同。
1、可变性
String类中是用一个由final修饰的字符数组保存字符串,所以String对象是不可变的。
StringBuffer以及StringBuilder 都是继承了AbstractStringBuilder类,在类中也是用字符数组存储字符串,但是字符数组并没有用final关键字修饰,所以这两种对象都是可变的。
2、线程安全性
String中的对象是不可变的,也就能理解为字符型常量,常量是线程安全的。
上文说到,AbstractStringBuilder是StringBuffer和StringBuilder的公共父类,定义了一些针对字符串的基本操作,也就是公共方法。StringBuffer针对这些公共方法或者是对调用的方法加了同步锁,所以是线程安全的。
而StringBuilder并没有加同步锁,所以是线程不安全的。
3、性能
每一次对String进行操作时,都会生成一个新的String对象,然后指针指向新的String对象。
StringBuffer每次都是对StringBuffer对象本身进行操作,并不是生成新的对象并改变对象引用。
StringBuilder相对于StringBuffer来说,性能有10%~15%的提升,但是StringBuilder是线程不安全的。
所以对于三者的使用总结:
1、String = 操作量少的数据
2、StringBuilder = 单线程操作字符串缓冲区下操作大量数据
3、StringBuffer = 多线程操作字符串缓冲区下操作大量数据
4、总结
String是不可变的、线程安全的以及适合操作数据量较少的时候使用。
StringBuffer是可变的、线程安全的以及适合多线程操作大量数据的时候使用。
StringBuilder是可变的、线程不安全的以及适合单线程操作大量数据的时候使用。