Java | 源码知识点之StringBuffer&String

2018-01-09  本文已影响0人  脱脂蛋丁

StringBuffer和StringBuilder皆extends AbstractStringBuilder

StringBuilder单线程使用,StringBuffer多线程使用,其他的基本一样。

//空的SB初始大小为16

public StringBuffer(){
    super(16)
}

public StringBuffer(CharSequence seq) {
    this(seq.length() + 16);
    append(seq);
}
  1. 在向StringBuffer添加内容之前(append),代码会首先确定是否需要进行扩容。StringBuffer和StringBuilder的扩容皆继承自AbstractStringBuilder
    public void ensureCapacity(int minimumCapacity) {
            if (minimumCapacity > 0)
                ensureCapacityInternal(minimumCapacity);
        }
    
        /**
         * This method has the same contract as ensureCapacity, but is
         * never synchronized.
         */
        private void ensureCapacityInternal(int minimumCapacity) {
            // overflow-conscious code
            if (minimumCapacity - value.length > 0)
                expandCapacity(minimumCapacity);
        }
    
        /**
         * This implements the expansion semantics of ensureCapacity with no
         * size check or synchronization.
         */
        void expandCapacity(int minimumCapacity) {
            int newCapacity = value.length * 2 + 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);
        }
  1. append方法主要基于两种实现,一种是调用System.arraycopy方法,另一种就是在char[]后面进行添加,实际上两种方式都是在数组后添加,只不过一种是调用System的,一种是jdk实现的。
  2. delete,deleteChar,replace等方法都是对char[]进行特定长度的复制+替换操作,使用System.arraycopy方法进行操作。
  3. insert方法则是首先进行扩容,然后利用System.arraycopy方法进行复制,在进行insert操作。
上一篇下一篇

猜你喜欢

热点阅读