我看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() 實時創建字符串拷貝返回