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类似,不再赘述。

posted @ 2022-04-07 22:33  r1-12king  阅读(581)  评论(1编辑  收藏  举报