AbstractStringBuilder是StringBuffer和StringBuilder的父类
package com.amazing.jdk.string_2017_12_31;
import java.util.Arrays;
public abstract class MyAbstractStringBuilder {
//用来存储字节
char[] value;
//字节的数量
int count;
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
/**
* 无参的构造方法
*/
MyAbstractStringBuilder(){}
/**
* 有参的构造方法
* @param capacity
* @return
*/
MyAbstractStringBuilder(int capacity){
value = new char[capacity];
}
/**
* 已存储字符长度
* @return
*/
public int length(){
return count;
}
/**
* 字符数组长度
* @return
*/
public int capacity(){
return value.length;
}
/**
* 确保不会数组下标越界
* length --->2*length+2 --->max_size---> Integer.Max
* @param minimumCapacity
*/
public void ensureCapacity(int minimumCapacity){
if(minimumCapacity>0){
//大于0
if(minimumCapacity-value.length>0){
//长度大于字符数组长度(容量不够),进行扩容
int newCapacity = (value.length*2)+2; //位运算 (value.length << 1) + 2;
if(newCapacity - minimumCapacity < 0){
//扩容两倍还是不够,就让数组长度等于传进来的数
newCapacity = minimumCapacity;
}
if(MAX_ARRAY_SIZE - minimumCapacity > 0){
value =Arrays.copyOf(value,newCapacity);
}else {
if(minimumCapacity>Integer.MAX_VALUE){
//超出内存错误
throw new OutOfMemoryError();
}
value=Arrays.copyOf(value,minimumCapacity);
}
}
}
}
/**
* 对应下标的字符
* @param index
* @return
*/
public char charAt(int index){
if(index<0 || index>=count){
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
/**
* 追加字符串
* @param str
* @return
*/
public MyAbstractStringBuilder append(String str){
if(str==null){
return appendNull();
}
int len = str.length();
ensureCapacity(count+len);
//长度变化
count = count+len;
return this;
}
/**
* 追加:null
* @return
*/
public MyAbstractStringBuilder appendNull(){
int c=count;
ensureCapacity(c+4);
final char[] value=this.value;
value[c++] = ‘n‘;
value[c++] = ‘u‘;
value[c++] = ‘l‘;
value[c++] = ‘l‘;
count = c;
return this;
}
}