StringBuffer
StringBuffer是一个字符串缓冲区,如果需要频繁的对字符串进行拼接时,直接用+来拼接字符串,jvm会创建大量String对象,造成内存开销,建议使用StringBuffer。
StringBuffer与StringBuilder都继承自AbstractStringBuilder,AbstractStringBuilder中采用一个char数组来保存需要append的字符串,char数组有一个初始大小,默认长度为16,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展,也即重新申请一段更大的内存空间,然后将当前char数组拷贝到新的位置,因为重新分配内存并拷贝的开销比较大,所以每次重新申请内存空间都是采用申请大于当前需要的内存空间的方式,这里是2倍。所以在使用StringBuffer时最好预测并手动初始化长度,这样能够减少数组的拷贝,从而提高效率。
StringBuffer的构造方法
无参构造方法
public StringBuffer() {
super(16);
}
待参数构造方法
public StringBuffer(int capacity) {
super(capacity);
}
待参数构造方法
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
可以看到,如果创建对象时,没有明确指出字符串长度,系统默认长度为16,创建长度为16的char类型数组,如果指出对象长度,则创建
指定长度的char类型数组,如果传入参数是String类型的字符串,创建(字符串长度+16)的char数组
StringBuffer的append方法
append(String str)方法拼接字符串,以char数组的方法添加元素,避免了+拼接创建多个对象的内存开销
insert(offset, str)方法在指定位置开始插入字符串str,原本的字符串部分往后移
delete(start, end)方法,在指定的开始和结束位置之间删除字符串,前开后闭
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
System.out.println(sb.capacity());// 16
StringBuffer sb1 = new StringBuffer(100);
System.out.println(sb1.capacity());// 100
StringBuffer sb2 = new StringBuffer("hello");
System.out.println(sb2.capacity());// 16+5=21
StringBuffer sb3 = new StringBuffer(30);
sb3.append("hello");
sb3.append(" ");
sb3.append("world");
System.out.println(sb3);// hello world
// insert方法在指定位置插入字符串
sb3.insert(3, "423");
System.out.println(sb3);//hel4231o world
//delete方法删除指定位置之间的字符串,前闭后开,下行删除从3到6之前的字符串
sb3.delete(3, 6);
System.out.println(sb3);//hello world
}
out:
16
100
21
hello world
hel423lo world
hello world
String与StringBuffer,StringBudder的区别?
String是不可变字符序列,存储在字符串常量池中
StringBuffer的底层是char数组,字符串长度超过当前char数组容量时,系统会对该数组进行扩容
StringBuilder和StringBuffer的区别
StringBuilder和StringBuffer里面的方法是一样的
StringBuffer是jdk1.0版本中加入的,StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,但效率低
StringBuilder是jdk5版本加入的,StringBuilder 没有synchronized 修饰,是线程不安全的,效率高
参考https://blog.csdn.net/shi1122/article/details/8053680