面试官问:String、StringBuilder、StringBuffer有什么区别么?
这个问题是个高频问题,所以今天从源码上进行深度刨析他们的区别。
如何回答:
从四个点出发:
1、可变/不可变类
String是不可变类。他被被final修饰,所以每一次的创建修改删除都要重新分配内存创建新的对象。
StringBuilder和StringBuffer是可变类,修改以及追加都不会创建新的对象。
2、线程安全性
String被final修饰是线程安全的
StringBuffer使用了同步锁是线程安全的
StringBuilder是线程不安全的
3、存储位置
String存储在字符串常量池中
StringBuilder和StringBuffer存放在堆中。
4、效率上
String < StringBuffer < StringBuilder
区别:
String | StringBuilder | StringBuffer | |
执行速度 | 最差 | 最高 | 其次 |
线程安全 | 线程安全 | 线程不安全 | 线程安全 |
使用场景 | 少量字符串操作 | 多线程环境下的大量操作 | 单线程环境下的大量操作 |
从上面表格可以得出的三者区别结论,下面我们分别分析下:
String
String是把数据存放在了字符串常量池中,所有的String都是常量的方式来保存的,并且它是被final修饰的所以是线程安全的。每一个String对象在被创建好后就不会再发生任何改变,如果进行值的重新指向,会在池中寻找或者创建一个新的对象。
他是支持查找不支持修改的,所以执行效率最低。
适合使用在少量字符串操作的情况下。
StringBuilder
StringBuilder是执行效率最高的,底层和StringBuffer一样通过char[]数组来实现,支持查询修改操作,效率高但是不安全
不安全:
在进行多线程处理的时候,多个线程对同一个变量进行修改查询操作的时候会出现数据的混乱,执行错误逻辑,它没有对线程安全进行考虑,是线程不安全的。
适合使用在单线程大象字符串操作情况下。
StringBuffer
StringBuffer效率虽然没有StringBuilder高,但是比String效率高的多。
效率低的原因:
在考虑线程安全的情况下,在进行字符串操作的时候使用了 synchronized 关键字的进行加锁操作来保证线程的安全性。
适合使用在多线程对多字符串操作的情况下。
在回答这个问题的适合从总结出发,重心放在线程安全的角度出发,如果要继续深入的话要从加锁往下深入。