概述
相信使用java的小伙伴对于String、StringBuffer、StringBuilder这三者已经很熟悉,特别是对于String是我们常用的数据类型。那么这三者有什么区别呢?是否是线程安全的呢?在开发中我们又该如何选择呢?
String、StringBuffer、StringBuilder区别
简单的来说,String是不可变的;StringBuffer和StringBuilder是可变的。可以通过看源码来查看其底层的实现。
String源码
可以看到String是使用了private final char value[]来存放字符串,因此是不可变的。
StringBuffer和StringBuilder继承关系
StringBuffer和StringBuilder都继承了AbstractStringBuilder,而AbstractStringBuilder是使用char value[]来存放字符串,因此StringBuffer和StringBuilder都是可变的。
线程安全性
String 中的对象是不可变的,也就可以理解为常量,线程安全。
AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
StringBuffer源码
StringBuilder源码
String、StringBuffer、StringBuilder的使用总结
每次对String类型进行修改的时候,都会生产一个新的String对象,然后将指针指向新的String对象。
StringBuffer和StringBuilder修改的时候,都是对对象本身的操作,而不是生辰新的对象。
并且在相同的情况下,使用StringBuilder比StrinBuffer仅能获得10%~15%的性能提升,但是却要冒多线程不安全的风险。
综合这些要素,可以得到如下总结:
(1)操作少量的数据或者定义之后后续不会改变的数据:使用String
(2)单线程字符串缓冲区下操作大量数据:使用StingBuilder
(3)多线程字符串换中去下操作大量数据:使用StringBuffer