【JavaSE】StringBuilder类与StringBuffer类

1.对比:String、StringBuffer、StringBuilder

  • String(JDK1.0):不可变字符序列
  • StringBuffer(JDK1.0):可变字符序列、线程安全、效率低
  • StringBuilder(JDK5.0):可变字符序列、线程不安全、效率高

如果要频繁的修改数据,应使用 StringBuilder或 StringBuffer;因为String的效率比较差,每次改变值都会产生一个新的对象.
 
StringBuilder 和 StringBuffer 非常相似,均代表可变的字符串序列,而且提供相关功能的方法也一样。他们都是 AbstractStringBuilder类的子类,并且重写了相关方法,并在这些方法中显示的调用父类的方法,而StringBuffer的大多方法使用 synchronized作同步处理,因此是线程安全的,但也因此效率相对 StringBuilder较低。
 
StringBuilder:
public StringBuilder reverse() {
      super.reverse();
      return this;
}

StringBuffer:
public synchronized StringBuffer reverse() {
      toStringCache = null;
      super.reverse();
      return this;
}

 

2.StringBuffer源码分析

空参数构造方法初始 char[]容量为 16:
public StringBuffer() {
      super(16);
}

有参数构造方法初始 char[]容量为 length + 16:
public StringBuffer(String str) {
      super(str.length() + 16);
      append(str);
}

若要添加的数据底层数组已经满了,就会进行扩容,默认情况下:扩容为原来的2倍 + 2,同时复制原来的数组元素到新的数组中
 
有一种指定容量的构造方法,使用此方法可以在需要对原有的 16容量进行扩容的的情况下提高效率:
StringBuffer(int capacity) 或 StringBuilder(int capaciry)

String str1 = new String(); // new char[0];
String str2 = new String("abc"); // new char[]{'a','b','c'};

StringBuffer buffer1 = new StringBuffer(); // new char[16];
buffer1.append('a'); // value[0] = 'a';
buffer1.append('b'); // value[1] = 'b';

StringBuffer buffer2 = new StringBuffer("abc"); // new char["abc".length + 16];
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

り澄忆秋、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值