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; } }