美文网首页
Java | 源码知识点之StringBuffer&String

Java | 源码知识点之StringBuffer&String

作者: 脱脂蛋丁 | 来源:发表于2018-01-09 10:14 被阅读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操作。

    相关文章

      网友评论

          本文标题:Java | 源码知识点之StringBuffer&String

          本文链接:https://www.haomeiwen.com/subject/jmlwnxtx.html