文章目录
- 1.StringBuffer
- 1.1 构造方法
- 1.2 常用方法
- 2.StringBuilder
- 3.String、StringBuffer、StringBuilder的区别
1.StringBuffer
- 内容可变的字符串类,适应StringBuffer来对字符串的内容进行动态操作,不会产生额外的对象。
- StringBuffer在初始时,默认是有16个字符来作为缓冲区
public StringBuffer(int capacity) {
super(capacity);
}
public StringBuffer() {
super(16);
}
1.1 构造方法
- new StringBuffer();
- new StringBuffer(String);
- new StringBuffer(int);
- new StringBuffer(charSequence);
public class TestStringBuffer {
public static void main(String[] args) {
StringBuffer stringBuffer=new StringBuffer("abc");
//append():在当前StringBUffer对象上,追加其他内容
stringBuffer.append("ccc");
/**
* 与String不一样
* StringBuffer中的所有操作都是在原有的StringBuffer上做的修改
*/
System.out.println(stringBuffer);//abcccc
//StringBuffer对象可以无限追加操作
stringBuffer.append("XXX").append(12);
System.out.println(stringBuffer);//abccccXXX12
//将StringBuffer对象转为String类型
String x=stringBuffer.toString();//这里拿到的是String对象
System.out.println(x);//abccccXXX12
}
}
比较String和StringBuffer的效率
public class TestStringBuffer {
public static void main(String[] args) {
//10万个字符串累加效果 对比String和StringBUffer的效率
//String
long t1= System.currentTimeMillis();
String str=new String("abc");
for (int i = 0; i < 100000; i++) {
str+="abc";
}
long t2=System.currentTimeMillis();
long t=t2-t1;
System.out.println(t);//2687 2539 2542
//StringBuffer
long t1= System.currentTimeMillis();
StringBuffer buffer =new StringBuffer("abc");
for (int i = 0; i < 100000; i++) {
buffer.append("xxx");
}
long t2=System.currentTimeMillis();
long t=t2-t1;
System.out.println(t);//4
}
}
1.2 常用方法
append() | 在当前StringBUffer对象上,追加其他内容 |
---|---|
capacity() | 返回当前StringBuffer的容量 |
length() | 返回长度 |
setCharAt(int,char) | 将给定索引位置的字符设置为第二个参数给定的值 |
reverse() | 将StringBuffer内容反转 |
delete(int,int) | 删除在StringBuffer中从指定索引开始(包含)到结束(不包含)的字符串 |
toString() | 将StringBuffer转成字符串 |
insert(int,Object) | 在指定索引位置,插入给定值 |
replace(int,int,String) | 将指定的字符串替换到起始(包含)位置和结束(不包含)位置中 |
deleteCharAt(int) | 删除指定索引位置的字符 |
public class TestStringBuffer_1 {
public static void main(String[] args) {
StringBuffer buffer=new StringBuffer();
System.out.println(buffer.capacity());//16
StringBuffer buffer=new StringBuffer("abc");
System.out.println(buffer.capacity());//19
}
}
上述程序结果不同的原因:
案例:判断从键盘接收一行文字,是否是回文 例如:abcba
Scanner scanner=new Scanner(System.in);
System.out.println("请输入一行文字:");
String str=scanner.next();
StringBuffer buffer=new StringBuffer(str);
buffer.reverse();
//boolean b=str.equals(buffer);//false 因为在调用String的equals方法时,要求必须是String类型才可以,str是String类型,而buffer是StringBuffer类型。
//解决办法一:把StringBuffer调用toString方法转成String类型
boolean b=str.equals(buffer.toString());
//解决办法二:调用contentEquals方法
boolean b=str.contentEquals(buffer);
System.out.println(b);
StringBuffer buffer=new StringBuffer("abcdef");
//delete(int,int):删除在StringBuffer中从指定索引开始(包含)到结束(不包含)的字符串
buffer.delete(0,3);
System.out.println(buffer);//def
//insert(int,Object):在指定索引位置,插入给定值
buffer.insert(0,"XXX");
System.out.println(buffer);//XXXdef
StringBuffer buffer=new StringBuffer("13566667777");
//replace(int,int,String):将指定的字符串替换到起始(包含)位置和结束(不包含)位置中
buffer.replace(3,7,"****");
System.out.println(buffer);//135****7777
//deleteCharAt(int):删除指定索引位置的字符
buffer.deleteCharAt(0);
System.out.println(buffer);//35****7777
2.StringBuilder
-
提供了和StringBuffer相同的API
-
StringBuffer的方法,都有synchronized修饰,是线程安全的
-
StringBuild的方法,没有synchronized修饰,非线程安全的。如果是单线程操作字符串相关处理,StringBuilder的效率最高。
3.String、StringBuffer、StringBuilder的区别
-
String和StringBuffer的区别: 一个是常量,一个是变量。String是一个final修饰的终结类,不能产生子类,是使用final的byte数组来存储值,所以一旦创建不能改变。如果疆场对字符串进行修改、删除或者插入操作,建议使用StringBuffer效率更高
-
StringBuffer和StringBuilder的区别: 一个是有线程安全的,一个是非线程安全的