我看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() 实时创建字符串拷贝返回