概述
StringBuufer和StringBuilder在创建的时候首先创建一个默认初识容量为16的char[]数组,然后 然后通过append添加内容,当总长度超出字符串容量的时候,会进行扩容,扩容规则为在当前的容量上*2+2,为新的容量
扩容机制为什么要+2?
因为我们创建StringBuffer的时候,可以通过参数手动设置初始容量,如果你输入的容量为0,这个时候在扩容机制里面的通过位运算符向右移动1位还是0,所以会出现问题,所以需要加2,防止这种情况出现
测试案例
public static void test(){
StringBuffer str = new StringBuffer();
System.out.println(str.length());//长度为0
System.out.println(str.capacity());//初识容量:16
str.append("abcdeabcdeabcdeab");//添加1个长度为17的字符串
System.out.println(str.length());//长度为17
System.out.println(str.capacity());//容量:34
str.append("abcdeabcdeabcdeabc");//添加18个字符串
System.out.println(str.length());//长度为35
System.out.println(str.capacity());//容量为70
}
测试案例2
public static void m2(){
StringBuffer str = new StringBuffer();
String item = "";
for (int i = 0; i < 36; i++) {
item += "a";
}
//需要添加的字符串的长度36
System.out.println(item.length());//36
str.append(item);
System.out.println("长度" + str.length());//36
//源码分析得知扩容计算后,这个容量比需要的容量还少,那么让容量直接等于需要的容量
System.out.println("容量" + str.capacity());//36
//再次添加 验证是否需要扩容
str.append("d");
System.out.println("长度" + str.length());//37
//进行扩容后,发现容量够用,所以原本容量36*2+2 = 现在的容量74
System.out.println("容量" + str.capacity());//74
}
源码分析
private int newCapacity(int minCapacity) {
// overflow-conscious code
//新的容量=当前的长度通过位运算符向右移动1位并且+2
int newCapacity = (value.length << 1) + 2;
//如果新的容量比当前容量小
if (newCapacity - minCapacity < 0) {
//新的容量=当前容量
newCapacity = minCapacity;
}
//返回 如果新容量小于0 或者 新容量大于最大值 那么抛出异常 否则返回新容量
return (newCapacity <= 0 || MAX_ARRAY_SIZE - newCapacity < 0)
? hugeCapacity(minCapacity)
: newCapacity;
}
StringBuffer和StringBuilder常用方法
append() | 添加 |
delete() | 删除 |
setCharAt() | 修改 |
charAt() | 查询 |
insert() | 插入 |