JAVA提供了两个可以储存和操作字符串的类:String和StringBuffer。
我们知道String类提供了数值不可改变字符串,而StringBuffer类提供的字符串进行修改,该类有StringBuffer(),StringBuffer(int size),StringBuffer(String s)三个改造方法。
初始化的容量:
扩容:
当使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;
StringBuffer进行字符串append添加的时候,会先计算添加后字符串大小,并传给方法:ensureCapacityInternal()
1. 首先尝试将新容量扩为大小变成 2倍+2。
2. 若满足需要,新容量为该计算值。
我们知道String类提供了数值不可改变字符串,而StringBuffer类提供的字符串进行修改,该类有StringBuffer(),StringBuffer(int size),StringBuffer(String s)三个改造方法。
初始化的容量:
扩容:
当使用append()方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将久的复制过去;
StringBuffer进行字符串append添加的时候,会先计算添加后字符串大小,并传给方法:ensureCapacityInternal()
改方法判断是否扩容,若需要则调用expandCapacity方法进行扩容。如下:
1. 首先尝试将新容量扩为大小变成 2倍+2。
2. 若满足需要,新容量为该计算值。
3. 若不满足,直接扩容成字符串长度。
例子:
例子一:根据2倍+2进行扩容。
@Test
public void testStringBuffer() {
StringBuilder sb = new StringBuilder();
System.out.println(" length " + "capacity " + "Will append length ");
System.out.println("Before "+sb.length() + " " + sb.capacity()+" 16");
sb.append("12345678901234567");// add 16
System.out.println("After "+sb.length() + " " + sb.capacity()+" 18");
sb.append("1234567890123456789");// add 18
System.out.println("After "+sb.length() + " " + sb.capacity());
System.out.println();
}
结果:
length capacity Will append length
Before 0 16 16
After 17 34 18
After 36 70
例子二:直接扩容成实际需要的长度。
@Test
public void testStringBuffer2() {
StringBuilder sb = new StringBuilder();
System.out.println(" length " + "capacity " + "Will append length ");
System.out.println("Before "+sb.length() + " " + sb.capacity()+" 36");
sb.append("123456789012345671234567890123456789");// add 16
System.out.println("After "+sb.length() + " " + sb.capacity());
System.out.println();
}
输出:
length capacity Will append length
Before 0 16 16
After 36 36