一. 概述
StringBuffer是字符串缓冲区,是一个容器。
二. 特点
- 长度可变。(数组也是容器,长度固定)
- 可以直接操作多种数据类型。(数组一次只能操作一种数据类型)
可以是除了byte/short外的其它基本数据类型、object类、String类、StringBuffer类
- 最终会通过toString()方法变成字符串
StringBuffer的对象不能直接输出,需要转换成String字符串输出
三. 常见操作
1. 存储
StringBuffer append(数据);//将指定数据作为参数添加到已有数据的结尾处
StringBuffer insert(index,数据);//将数据插入到指定index位置
例子1:
class StringBufferDemo{
public static void main(String[] args){
StringBuffer sb=new StringBuffer();//构造一个没有字符的字符串缓冲区
StringBuffer sb1=sb.append(34);
sop(sb.toString());
sop(sb1.toString());
sb.append("abc").append(true).append(34);//append()返回的是本类对象,可以继续调用本类方法
sop(sb.toString());
sb.insert(3,"qq");
sop(sb.toString());
}
public static void sop(String str){
System.out.println(str);
}
}
运行结果是:
例子2:
class StringBufferDemo{
public static void main(String[] args){
StringBuffer sb=new StringBuffer();//构造一个没有字符的字符串缓冲区
sb.append("abc").append(true).append(34);//append()返回的是本类对象,可以继续调用本类方法
sb.insert(100,"qq");
sop(sb.toString());
}
public static void sop(String str){
System.out.println(str);
}
}
运行结果是:
2. 删除
StringBuffer delete(int start, int end);//删除缓冲区中的数据,包含start不包含end
StringBuffer deleteCharAt(int index);//删除指定位置的字符
例子:
class StringBufferDemo{
public static void main(String[] args){
StringBuffer sb=new StringBuffer("abcde");
sb.delete(1,3);
sop(sb.toString());
StringBuffer sb1=new StringBuffer("ABCDE");
sb1.delete(0,sb1.length());
sop(sb1.toString());
StringBuffer sb2=new StringBuffer("qwert");
sb2.deleteCharAt(2);
sop(sb2.toString());
}
public static void sop(String str){
System.out.println(str);
}
}
运行结果是:
3. 获取(同String类的获取方法、子串方法)
int length();//获取字符串缓冲区的长度,也就是字符串缓冲区包含的字符数
char charAt(int index);//获取位置index上的某个字符
int indexOf(String str);//获取子串str在字符串缓冲区中第一次出现的位置
int indexOf(String str,int fromIndex);//从fromIndex开始,获取str在字符串缓冲区中第一次出现的位置
int lastIndexOf(String str);//获取子串str在字符串缓冲区中最后一次出现的位置
String substring(int start);//返回从指定位置开始到结尾的子串
String substring(int start,int end);//返回子串,包含start不包含end
4. 修改
StringBuffer replace(int start,int end,String str);//用指定子串str代替字符串缓冲区中的序列,包含start不包含end
void setCharAt(int index,int ch);//将指定位置index的字符设置为ch
例子:
class StringBufferDemo{
public static void main(String[] args){
StringBuffer sb=new StringBuffer("abcde");
sb.replace(1,4,"java");
sop(sb);
StringBuffer sb1=new StringBuffer("abcde");
sb1.setCharAt(2,'k');
sop(sb1);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
运行结果是:
5. 反转
StringBuffer reverse();
例子:
class StringBufferDemo{
public static void main(String[] args){
StringBuffer sb=new StringBuffer("abcde");
sb.reverse();
sop(sb);
}
public static void sop(Object obj){
System.out.println(obj);
}
}
运行结果是:
6. 将缓冲区中指定数据存储到指定字符数组中
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin);//将字符串缓冲区中指定位置的数据存储到字符数组dst中,包含srcBegin不包含srcEnd
class StringBufferDemo{
public static void main(String[] args){
StringBuffer sb=new StringBuffer("abcdef");
char[] chs=new char[4];
sb.getChars(1,4,chs,1);
for(int x=0;x<chs.length;x++){
sop("chs["+x+"]="+chs[x]);
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
运行结果是:
四. StringBuilder
一个可变的字符序列,此类提供一个与StringBuffer兼容的API
但不保证同步,该类被设计用作StringBuffer的一个简易替换。
在JDK1.5版本之后,出现了StringBuilder
StringBuffer是线程同步的(安全)
StringBuilder是线程不同步