Java基础之String、StringBuffer、StringBuilder介绍

345 阅读1分钟

String

String是不可变的字符串,其具体定义如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];

    private int hash; // Default to 0
    
    private static final long serialVersionUID = -6849794470754667710L;
    
}

AbstractStringBuilder

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

    /**
     * The count is the number of characters used.
     */
    int count;

}    

StringBuilder

public final class StringBuilder
public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence
{

    static final long serialVersionUID = 4383685877147921099L;

    public StringBuilder() {
        super(16);
    }

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

StringBuffer

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

    static final long serialVersionUID = 3388685877147921107L;

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

第一、StringBuilder和StringBuffer都是继承自AbstractStringBuilder

第二、通过查看AbstractStringBuilder的定义我们可以看出StringBuilder和StringBuffer都是可以长度可变的字符串。

第三、StringBuffer是线程安全的,在各种操作时候,都是用synchronized关键字进行加锁操作,保证只有一个线程对其的操作;而StringBuilder并没有进行加锁。

由此可以得出如下是用场景:

  1. 基本原则:如果要操作少量的数据,用String;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
  2. 不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,
  3. StringBuilder一般使用在方法内部来完成类似”+”功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中

参考文章