String、StringBuffer、StringBuilder的区别是什么?

这是一道很基础,也很常见的笔试题。

参考链接:

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来获取更高的性能是比较好的选择。

posted on 2019-08-30 22:09  天崖天涯  阅读(131)  评论(0编辑  收藏  举报