1. 程式人生 > >筆記:StringBuffer的清空方式setLength和delete的比較區別

筆記:StringBuffer的清空方式setLength和delete的比較區別

無聊拔碼看了這個類

1.先看setLength,簡單就是將count直接賦值為0,但是value沒有任何清除

    public void setLength(int newLength) {
        if (newLength < 0)
            throw new StringIndexOutOfBoundsException(newLength);
        ensureCapacityInternal(newLength);

        if (count < newLength) {
            Arrays.fill(value, count, newLength, '\0');
        }

        count = newLength;
    }

我們setLength(0)後在append的時候操作

    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count); // 此時count為0 len為當前插入串的長度
        count += len; // 重新標記count 在toString的時候從value的0到count的位置取出資料
        return this;
    }

在看string 類的getChars

    public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
        if (srcBegin < 0) {
            throw new StringIndexOutOfBoundsException(srcBegin);
        }
        if (srcEnd > value.length) {
            throw new StringIndexOutOfBoundsException(srcEnd);
        }
        if (srcBegin > srcEnd) {
            throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
        }
        // 將插入字串拷貝到stringBuffer的value,這裡是0開始 
        System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
    }

2.delete操作 delete(0,len)

    public AbstractStringBuilder delete(int start, int end) {
        if (start < 0)
            throw new StringIndexOutOfBoundsException(start);
        if (end > count)
            end = count;
        if (start > end)
            throw new StringIndexOutOfBoundsException();
        int len = end - start;
        if (len > 0) {
            // delete 操作立馬回拷貝陣列,比setlength多一個拷貝操作
            System.arraycopy(value, start+len, value, start, count-end);
            count -= len;
        }
        return this;
    }

所以setlength會比delete少一次System.arraycopy