我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题线程安全的可变字符序列
StringBuffer、String和StringBuilder之间的区别
StringBuffer类
线程安全(synchronized)有上锁
当向StringBuffer中添加内容时,是将内容添加到底层的数组中,数组没有被final修饰,当数组装满时,会创建一个新的数组,将新数组地址给底层数组,StringBuffer对象是不会改变的.(若频繁的对字符串进行修改,最好使用StringBuffer)
// 线程安全, 可变字符串
private transient char[] toStringCache;//创建一个数组来存放字符串元素
public StringBuffer() {
super(16);//如果创建时,没有输入字符串,则默认容量为16
}
public StringBuffer(int capacity) {
super(capacity);//可以规定长度
}
public StringBuffer(String str) {
super(str.length() + 16);//输入的字符串长度加上默认的16长度
append(str);//向末尾追加字符串
}
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);//
append(seq);
}
//内存超出时,再创建一个新的数组
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
String类
String+="abc"时,每次创建的都是一个新的对象,因为它的底层数组被final修饰,给数组赋值后就不能再更改了。
private final char value[];
//String类中底层的数组被final修饰,只能输入一次,再输入时就创建了一个新的对象 private static final ObjectStreamField[] serialPersistentFields =new ObjectStreamField[0];
public String() {
this.value = "".value;
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}//传入一个字符类型的数组,将数组转换为字符串类型
StringBuilder类
线程不安全(在单线程且有大量数据时使用)
StringBuilder类功能和StringBuffer功能完全一致
多线程不安全 可变字符串
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
● String:是字符常量,适用于少量的字符串操作的情况
● StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
● StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
构造方法
public StringBuffer() //无传参构造方法,默认长度为16
public StringBuffer(String str)//有参构造方法,长度为传入字符串长度+16
添加功能
public StringBuffer append(String str) //传入的字符串接在原字符串后面
StringBuffer stringBuffer = new StringBuffer("abcd");//20
stringBuffer.append("efg111");//abcdefg111
public StringBuffer insert(int offset,String str)
StringBuffer stringBuffer = new StringBuffer("abcdefg");//23
stringBuffer.insert(2,"xx");//向指定的位置插入字符串
//abxxcdefg
删除功能
public StringBuffer deleteCharAt(int index) //删除指定位置的字符串(索引位置)
public StringBuffer delete(int start,int end) //删除指定区间的内容([0,3))
StringBuffer stringBuffer =new StringBuffer("abcdefg");//23
stringBuffer.deleteCharAt(1);//acdefg
stringBuffer.delete(0,3);//删除指定区间的内容 包含开始,不包含结束
替换功能
public StringBuffer replace(int start,int end,String str) //使选择区间的字符串替换为输入的新字符串
StringBuffer stringBuffer =new StringBuffer("abcdefg");//23
stringBuffer.replace(0,3, "XXX");//替换
System.out.println(stringBuffer);//XXXdefg
反转功能
public StringBuffer reverse()//反转数组的顺序
StringBuffer stringBuffer =new StringBuffer("abcdefg");//23
stringBuffer.reverse();//逆序字符串
System.out.println(stringBuffer);//gfedcba
length()方法
StringBuffer stringBuffer =new StringBuffer("abcdefg");//23
String s1="abcd";
System.out.println(s1.length());//4
System.out.println(stringBuffer.length());//返回的是底层数组中实际转入的字符个数 7
截取功能
public String substring(int start)
public String substring(int start,int end)
StringBuffer stringBuffer = new StringBuffer("abcdefg");
String sub1 = stringBuffer.substring(2);//截取一个字符串副本返回
String sub2 = stringBuffer.substring(2,5);//截取一个字符串副本返回
System.out.println(sub1);//cdefg
System.out.println(sub2);//cde