我看JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder

我看JAVA 之 AbstractStringBuilder & StringBuffer & StringBuilder

注:基於jdk11

AbstractStringBuilder

可變的抽象字符串創建類

實現瞭如下幾個接口:

1. Appendable    此接口的實現類可以拼接字符序列或單個字符。不保證線程安全,由實現類實現是否線程安全。使用java.util.Formatter格式化,必須爲Appendable實現類
2. CharSequence

幾個重要的成員變量:

/**
 * 字符串存儲數據的字節數組,初始化的時候可以指定容量,默認爲16
 */
byte[] value;

/**
 * 編碼 0爲Latin1 1爲Utf-16
 */
byte coder;

/**
 * 當前字符串實際長度
 */
int count;

private static final byte[] EMPTYVALUE = new byte[0];

/**
    *  byte [] 最大長度限制,超過VM限制長度會導致OOM
    */
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

幾個重要的方法:

1. 返回當前字符串實際長度,count
public int length() {
        return count;
}
2. 返回字符串容量
public int capacity() {
        return value.length >> coder;
}
3. 擴容,字節數組拷貝
public void ensureCapacity(int minimumCapacity) {
       if (minimumCapacity > 0) {
                ensureCapacityInternal(minimumCapacity);
      }
}

private void ensureCapacityInternal(int minimumCapacity) {
       // overflow-conscious code
       int oldCapacity = value.length >> coder;
       if (minimumCapacity - oldCapacity > 0) {
               value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity) << coder);
       }
}
private int newCapacity(int minCapacity) {
        // overflow-conscious code
       int oldCapacity = value.length >> coder;
        int newCapacity = (oldCapacity << 1) + 2;
        if (newCapacity - minCapacity < 0) {
                newCapacity = minCapacity;
        }
    int SAFE_BOUND = MAX_ARRAY_SIZE >> coder;
    return (newCapacity <= 0 || SAFE_BOUND - newCapacity < 0)
            ? hugeCapacity(minCapacity)
            : newCapacity;
}

private int hugeCapacity(int minCapacity) {
        int SAFE_BOUND = MAX_ARRAY_SIZE >> coder;
       int UNSAFE_BOUND = Integer.MAX_VALUE >> coder;
       if (UNSAFE_BOUND - minCapacity < 0) { // overflow
                throw new OutOfMemoryError();
        }
        return (minCapacity > SAFE_BOUND)
            ? minCapacity : SAFE_BOUND;
}

StringBuffer

線程安全的AbstractStringBuilder實現類

幾個重要的方法:

1. toString() 使用緩存機制,在第一次調用toString()的時候會將實時生成的字符串拷貝保存在toStringCache中,下次調用直接返回,如有變化,toStringCache置空

StringBuilder

非線程安全的AbstractStringBuilder實現類

幾個重要的方法:

1. toString() 實時創建字符串拷貝返回
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章