线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。StringBuffer类对象像一个存储字符串的容器
我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题
public StringBuffer()
无参构造方法
//创建一个字符串缓冲区对象
StringBuffer sb=new StringBuffer();
public StringBuffer(int capacity)
指定容量的字符串缓冲区对象
//字符串缓冲区默认的容量为16,我们也可以指定长度,这个长度不能过长
StringBuffer sb = new StringBuffer(10);
public StringBuffer(String str)
指定字符串内容的字符串缓冲区对象
//字符串缓冲区对象在创建时就已经存储了字符串
//如果缓冲区的字符串超出了默认容积或者指定的容积,缓冲区会自动进行扩容
//如果初始化时指定了字符串的内容,那么缓冲区的容积就是16+指定字符串的长度
//该字符串缓冲区的容量为19
StringBuffer sb = new StringBuffer("abc");
public int capacity()
返回当前容量
public int length()
返回长度(字符数)
StringBuffer sb = new StringBuffer("abcde");
int num1=sb.capacity(); //21
int num2=sb.length(); //5
public StringBuffer append(String str)
将字符串添加到字符串缓冲区里面,并返回字符串缓冲区本身。
此处只是以添加字符串为例,StringBuffer对象中可添加多种数据类型数据,具体可查文档
public class Demo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//需要注意的是,返回的是字符串缓冲区本身。
//即不需要定义新的StringBuffer对象来存储返回的对象,字符串已经存储进sb对象中
sb.append("abc");
System.out.println(sb);
//因为返回的是StringBuffer类对象,所以我们可以再次调用append方法
sb.append("def").append(123);
System.out.println(sb);
}
}
/*
运行结果:
abc
abcdef123
*/
public StringBuffer insert(int offset,String str)
在指定位置把字符串插入到字符串缓冲区里面,并返回字符串缓冲区本身
此处只是以添加字符串为例,StringBuffer对象中可插入多种数据类型数据,具体可查文档
public class Demo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc123");
sb.insert(3,"def");
System.out.println(sb);
}
}
/*
运行结果:
abcdef123
*/
public StringBuffer deleteCharAt(int index)
删除指定位置的字符,并返回本身
public class Demo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc123");
sb.deleteCharAt(2);
System.out.println(sb);
}
}
/*
运行结果:
ab123
*/
public StringBuffer delete(int start,int end)
删除从指定位置开始到指定位置结束的内容,并返回本身。包含起始索引,不包含结束索引
public class Demo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc123");
sb.delete(1,4);
System.out.println(sb);
}
}
/*
运行结果:
a23
*/
public StringBuffer replace(int start,int end,String str)
从start位置开始到end位置结束用字符串str替换,并返回本身
public class Demo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc123");
sb.replace(3,6,"defg");
System.out.println(sb);
}
}
/*
运行结果:
abcdefg
*/
public StringBuffer reverse()
将字符串缓冲区中的字符串反转,返回其本身
public class Demo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc123");
sb.reverse();
System.out.println(sb);
}
}
/*
运行结果:
321cba
*/
public String substring(int start)
从指定位置截取到末尾
public String substring(int start,int end)
截取从指定位置开始到结束位置的字符串,包括开始位置,不包括结束位置
public class Demo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abc123");
String s1=sb.substring(3);
String s2=sb.substring(0,3);
System.out.println(s1);
System.out.println(s2);
}
}
/*
运行结果:
123
abc
*/
String转换为StringBuffer
//方式1:通过构造方法。
String str="abc";
StringBuffer sb=new StringBuffer(str);
//方式2:通过append()方法
String str="abc";
StringBuffer sb=new StringBuffer();
sb.append(str);
StringBuffer转换为String
//方式1:通过subString方法
StringBuffer sb = new StringBuffer("abc123");
String s=sb.substring(3);
//方式2:通过构造方法
StringBuffer sb=new StringBuffer("abc");
String s=new String(sb);
//方式3:通过toString方法
StringBuffer sb=new StringBuffer("abc");
String s=sb.toString();
StringBuffer和StringBuilder的区别:
StringBuilder相较于StringBuffer具有速度优势,因为它没有通过synchronized进行判断,所以StringBuilder效率高
但是也正是因为如此,StringBuilder的方法不是线程安全的
所以在只有主线程的情况下,推荐使用StringBuilder类,当程序中出现多条线程时,推荐使用StringBuffer类