java StringBuilder 与 StringBuffer之默认大小与扩容
1、StringBuilder 与 StringBuffer
StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
2、区别
StringBuffer 和 StringBuilder 区别在于,StringBuffer 是线程安全,StringBuilder 反之。
3、初始化大小
这里以StringBuffer说明。
构造方法:
StringBuffer(); StringBuffer(String str) StringBuffer(CharSequence seq) StringBuffer(int capacity)
- 写法一
StringBuffer sb = new StringBuffer(); sb.append("java");
实例化时,初始化大小容量为16
添加字符串时,会有容量大小的判断。
1 public AbstractStringBuilder append(String str) { 2 if (str == null) 3 return appendNull(); 4 int len = str.length(); 5 ensureCapacityInternal(count + len); 6 str.getChars(0, len, value, count); 7 count += len; 8 return this; 9 }
如果append的字符串长度超过当前容量(如16),则容量为扩充为原来的两倍+2 【2n+2】(34 ,34=16 * 2 + 2)
要是append的字符串长度超过当前容量,并且大于当前容量的两倍+2,则直接为字符串需要的长度。
测试代码如下:
1 public class Test { 2 public static void main(String[] args) { 3 StringBuffer sb = new StringBuffer(); 4 sb.append("java"); 5 System.out.println(sb.length()); //4 6 System.out.println(sb.capacity()); //16 7 sb.append("hello-world, hi, java"); 8 System.out.println(sb.length()); //25 9 System.out.println(sb.capacity()); //34 10 sb.append("hello-worldhello-worldhello-worldhello-worldhello-worldhello-worldhello-world"); 11 System.out.println(sb.length()); //102 12 System.out.println(sb.capacity()); //102 13 } 14 }
- 写法二
1 StringBuffer sb = new StringBuffer("java");
与写法一区别
实例化时,初始化大小容量为 (实例化参数字符串的长度+ 16),其它逻辑与写法一相同
1 public StringBuffer(String str) { 2 super(str.length() + 16); 3 append(str); 4 }
- 写法三
与写法一区别
实例化时,初始化大小容量为 (实例化参数字符串的长度+ 16),其它逻辑与写法一相同
1 public StringBuffer(CharSequence seq) { 2 this(seq.length() + 16); 3 append(seq); 4 }
- 写法四
StringBuffer sb = new StringBuffer(20);
与写法一区别
实例化时,初始化大小容量为 (自定义大小),其它逻辑与写法一相同。
1 public StringBuffer(int capacity) { 2 super(capacity); 3 }
StringBuilder和StringBuffer类似,不再赘述。