这是一道很基础,也很常见的笔试题。
参考链接:
https://baijiahao.baidu.com/s?id=1629804867201303563&wfr=spider&for=pc
https://blog.csdn.net/u011702479/article/details/82262823
直接放链接,链接中讲得更详细、更专业。但是篇幅也长。
以下仅说说我自己的理解。作为述说表达的练习,作为学习的记录,作为笔记的备忘。
总结放前面,如下:
String:不可变字符序列。
StringBuilder:可变字符序列。方法没加线程锁,线程不安全。
StringBuffer:可变字符序列。方法加了线程锁,线程安全。但是加了线程锁的代价是:性能变差。
ctrl+左键单击 String,可以看看String类里是什么:
String类存放值的代码是:private final char value[];——从代码中可以看出,String存放的是不可变(final修饰的)字符数组(char[])。
StringBuffer类的声明代码:
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
——从代码可以看出,StringBuffer继承了AbstractStringBuilder 类。
StringBuilder类的声明代码:
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
——从代码可以看出,StringBuilder继承了AbstractStringBuilder 类。
AbstractStringBuilder 类存放值的代码是:char[] value;——从代码中可以看出,String存放的是字符数组(char[])。和String相比,没有final修饰,是可变字符数组。
看起来StringBuffer和StringBuilder没有多大区别。然后,比较一下StringBuffer和StringBuilder中的append(String str)方法:
StringBuilder:
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuffer:
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
StringBuffer中的方法多了synchronized修饰,因此是线程安全的。
总结如下:
String:不可变字符序列。
StringBuilder:可变字符序列。方法没加线程锁,线程不安全。
StringBuffer:可变字符序列。方法加了线程锁,线程安全。但是加了线程锁的代价是:性能变差。
因此,在无需考虑线程安全的情况下,用StringBuilder来获取更高的性能是比较好的选择。