String,StringBuffer与StringBuilder的源码分析

String,StringBuffer与StringBuilder的区别

String是不可变对象,对于定义好的String对象,其值不会改变,如果对其值做出修改,则会在内存新建一个String对象。对于操作频繁的S字符串对象,不适合使用String。
因此诞生了StringBuffer与StringBuilder。StringBuffer和StringBuilder都可以通过方法对字符串尾部追加字符。并且不会产生新的对象,不会浪费内存。
两者的区别:StringBuffer线程安全的,但是效率低于StringBuilder,但是StringBuilder是线程不安全的。String是线程安全的。
三个对象的使用场景不同。
不频繁操作字符串的使用String
线程安全的使用StringBuffer
不需要线程安全的使用StringBuilder

深入探究String,StringBuffer与StringBuilder源码

String:部分源码


public final class String
    implements java.io.Serializable, Comparable, CharSequence {
   
    private final char value[];
    private int hash; // Default to 0
    
    private static final long serialVersionUID = -6849794470754667710L;
    private static final ObjectStreamField[] serialPersistentFields =
    new ObjectStreamField[0];

    public String() {
        this.value = "".value;
    }
    }

通过展示的部分源码可以看出定义的value的是final类型,一但定义就不能更改。所以String是不可变类,不可变类都是线程安全的。
StringBuffer:

public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{
    private transient char[] toStringCache;

    public StringBuffer() {
        super(16);
    }


    public StringBuffer(int capacity) {
        super(capacity);
    }

    @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
 }

通过源码可以看出每个操作字符串的方法都使用了synchronized锁,因此是线程安全的。也直接导致了效率不够高。
StringBuilder:

    @Override
    public StringBuilder append(Object obj) {
        return append(String.valueOf(obj));
    }

    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

和StringBuffer代码类似,只是每个方法上没有加上synchronized锁。因此效率较高。

你可能感兴趣的:(java基础)