String、StringBuffer和StringBuilder的异同
String:不可变的字符序列,底层使用char[]存储。
StringBuffer:since JDK1.0,可变的字符序列,效率低,线程安全,底层使用char[]存储。
StringBuilder:since JDK1.5,可变的字符序列,效率高,线程不安全,底层使用char[]存储。
可变性
package demo03;
public class SBTest {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
sb1.setCharAt(0,'m');
System.out.println(sb1);
sb1.append('d');
System.out.println(sb1);
}
}
mbc
mbcd
底层实现
源码空参构造器:
有参构造器(JDK8):
package demo03;
public class SBTest {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
System.out.println(sb1.length());
}
}
3
length源码:
扩容问题:如果要添加的数据底层数组装不下了,如何扩容?
默认情况下,扩容为原来的容量的二倍再+2,同时将原有的数组中的元素复制到新数组中。
开发中可以用下面的构造器,指定底层char数组容量:
常用方法
package demo03;
public class SBTest {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
sb1.append(1);
sb1.append('1');
System.out.println(sb1);
sb1.delete(2,4);//左闭右开
System.out.println(sb1);
StringBuffer sb2 = new StringBuffer("abc11");
sb2.replace(2,4,"hello");
System.out.println(sb2);
StringBuffer sb3 = new StringBuffer("abc");
sb3.insert(1,false);
System.out.println(sb3);
sb3.reverse();
System.out.println(sb3);
}
}
abc11
ab1
abhello1
afalsebc
cbeslafa
效率对比
StringBuilder>StringBuffer>>String