String、StringBuffer、StringBuilder的区别
String、StringBuffer、StringBuilder
这三种都可以用来处理字符串,可以从可变性、线程安全性以及性能几个方面来进行比较。
1.可变性
String类中使用final关键字修饰字符数组来保存字符串:
1 | private final char value[]; |
所以
String对象是不可变的。而StringBuffer和StringBuilder都继承自AbstractStringBuilder类,其中也是使用字符数组来保存字符串char[] value但是没有用final进行修饰,因此是可变的。
2.线程安全性
String的对象是不可变的,可以理解为常量,线程安全。AbstractStringBuilder是StringBuffer和StringBuilder的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer对方法或者对调用的方法加了sychronized同步锁,所以是线程安全的,而StringBuilder并没有加锁,所以是非线程安全的。
3.性能
每次对
String类型进行改变时都会生成一个新的String对象,然后将指针指向新的String对象;StringBuffer和StringBuilder每次都会对StringBuffer或者StringBuilder对象本身进行操作,并不会生成新的对象改变对象引用,但是由于加锁和不加锁的区别导致StringBuffer的性能比StringBuilder略低。
三者的使用总结
- 操作少量的数据适用
String- 单线程下操作字符串缓冲区下操作大量数据适用
StringBuilder- 多线程下操作字符串缓冲区下操作大量数据适用
StringBuffer