StringBuffer与StringBuilder源码解析

这是源码中2个类的声明
public final class StringBuilder
    extends AbstractStringBuilder
implements java.io.Serializable, CharSequence


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


可以看出StringBuffer与StringBuilder都继承自AbstractStringBuilder,他们的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,是线程安全的,而 StringBuilder是线程不安全的。
使用他们是为了提高Java中字符串连接的效率,因为直接使用+进行字符串连接的话,Jvm会创建多个String对象,造成一定的开销。
StringBuffer 始于 JDK 1.0 
    StringBuilder 始于 JDK 1.5 
    从 JDK 1.5 开始,带有字符串变量的连接操作(+),JVM 内部采用的是 StringBuilder 来实现的,而之前这个操作是采用 StringBuffer 实现的。


这是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;






这是扩容的源码
/**
     * This implements the expansion semantics of ensureCapacity with no
     * size check or synchronization.
     */
    void expandCapacity(int minimumCapacity) {
        int newCapacity = value.length * 2 + 2;
        if (newCapacity - minimumCapacity < 0)
            newCapacity = minimumCapacity;
        if (newCapacity < 0) {
            if (minimumCapacity < 0) // overflow
                throw new OutOfMemoryError();
            newCapacity = Integer.MAX_VALUE;
        }
        value = Arrays.copyOf(value, newCapacity);
    }



AbstractStringBuilder中采用一个char数组来保存需要append的字符串,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展。即重新申请一段更大的内存空间,然后将当前char数组拷贝到新的数组中。

猜你喜欢

转载自blog.csdn.net/qq_27327855/article/details/80425139
今日推荐