【2021-07-06】请说出 String,StringBuilder,StringBuffer 三者的区别?
请移步至:
每日一题 查看更多的题目 ~
答:
String 类中使用 final 关键字修饰的字符数组保存字符串
private final char value[];
所以 String 对象是不可变的,这就导致了每次对 String 对象添加,更改或删除字符的操作都会产生一个新的 String 对象。不仅效率低下,而且浪费了空间。
StringBuilder 和 StringBuffer 的对象都是可变的,他们都继承了AbstractStringBuilder 类;任何对他们指向的字符串的操作都不会产生新的对象;他们之间的区别是:StringBuilder 是线程不安全的;而 StringBuffer 是线程安全的。
源码上可以体现出 StringBuffer 是线程安全的,来看一下两个类的 append 方法:
StringBuffer 的 append 方法:
@Override
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
StringBuilder 的 append 方法:
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
我们可以看到 StringBuffer 和 StringBuilder 都直接调用了父类的append 方法;区别是 StringBuffer 有 synchronized 关键字为 append 方法加锁,所以保证了 StringBuffer 在使用中线程安全,但是这也说明了StringBuffer 的性能要略低于 StringBuilder。
三者的使用场景:
- 操作少量的数据时可以使用 String
- 单线程操作字符串缓冲区下的大量数据的时,适合使用 StringBuilder
- 多线程操作字符串缓冲区下的大量数据的时,适合使用 StringBuffer