String、StringBuffer、StringBuilder区别

  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;
    }

posted on 2019-03-01 10:57  jrz  阅读(62)  评论(0编辑  收藏  举报

导航