时间: 2020-11-25|38次围观|0 条评论

  1. String 为字符串常量,StringBuffer、StringBuilder为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。(他们三个都是不可变类)
    //代码来自JDK源码
//String
 public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
    }

    //JDK中StringBuffer和StringBuilder都继承AbstractStringBuilder
    abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;
}

  1. 速度String<StringBuffer<StringBuilder
    以下代码为例说明String字符串相加的JVM处理,进而说明其速度为什么慢。
    运行以下代码先输出abc后输出abcde,好像str被更改了,其实jvm在处理的时候是又实例化一个String对象然后把abcde放进新的对象,然后把str指向新的对象,最后把原来的存放abc的对象空间释放。
    而StringBuffer和StringBuilder在对字符串修改时不需要另外再实例化对象,所以他们来个速度比String快。但是StringBuilder为啥比StringBuffer快呢 ?继续往下看
 String str="abc";
 System.out.println(str);
  str=str+"de";
 System.out.println(str);
  1. StringBuffer线程安全,StringBuilder线程不安全
    由JDK源码可知StringBuffer方法有synchronized关键词修饰 是线程安全的。
    StringBuilder 没有加锁所以是线程不安全的。
    由于StringBuffer加锁开销导致他的速度比StringBuilder慢。
//StringBuffer
 @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
//StringBuilder
 @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

转载于:https://www.cnblogs.com/jiaorenzhan/p/10623948.html

原文链接:https://blog.csdn.net/weixin_30342827/article/details/95418291

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《String、StringBuffer、StringBuilder区别
   

还没有人抢沙发呢~