StringBuilder 和 常用容器初始化容量--性能--詳解

StringBuilder 和 常用容器初始化容量時儘量定初始化容量,有助於提高性能。

分析:

StringBuilder StringBuffer 與ArrayList對象一樣都是可變容量的。

底層實現都是char[] ,以數組形式實現的。

/**
* The value is used for character storage.
*/
char[] value;
大家都知道數組是定長的(確定了長都就不可改變的),那麼他是如何實現變長的呢,看下面源碼

public AbstractStringBuilder append(String str) {
    if (str == null)
        return appendNull();//處理空的情況,
    int len = str.length();
    //確定容量是否夠用,如果不夠用進行擴容,源碼下面有粘
    ensureCapacityInternal(count + len);
    str.getChars(0, len, value, count);
    count += len;
    return this;
}
/**
* 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) {
   //每次擴容使原有的2倍加2
   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);
}

看完上面的源碼,我們知道容量不夠用了就重新創建數組(也就是重新分配內存空間),這些操作都是耗時間和資源的的,如果我們在初始化時定了一個接近的容量,速度會有一定的提升
StringBuffer,ArrayList 等和這個擴容方法也是大同小異,所以我們一定要重視初始化容量的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章