Java中StringBuffer类
如果文本(字符串)不会改变就用String类,因为String对象是不可变的。
如果文本(字符串)可以改变并且在单线程中访问,使用StringBuilder。(一般建议优先采用)
如果文本(字符串)可以改变并且在多线程中访问,使用StringBuffer。
1.StringBuffer与String的区别
StringBuffer、StringBulider:线程安全的可变字符序列(字符串缓存区)
(线程安全:效率低;线程不安全:效率高)
String:不可变的字符序列
2.StringBuffer与StringBuilder的区别:
StringBuffer:线程安全,支持同步,速度慢
StringBilder:(通常优先使用)线程不安全,与StringBuffer功能相同,但不支持同步,效率更高
3.StringBuffer类的构造方法
三种构造方法中优先考虑使用此种方法,如果容器的大小不够,则会自动扩充
StringBuffer sb = new StringBuffer();
System.out.println(sb.length()); //实际内容的长度(实际值)...0
System.out.println(sb.capacity()); //容器的长度(理论值)...16(底层默认长度)
StringBuffer sb2 = new StringBuffer("woaixiyou");
System.out.println(sb2.length()); //实际内容的长度(实际值)...9
System.out.println(sb2.capacity()); //容器的长度(理论值)...25(16+9)底层默认长度加字符串本身长度大小
StringBuffer sb3 = new StringBuffer(10);
System.out.println(sb3.length()); //实际内容的长度(实际值)...0
System.out.println(sb3.capacity()); //自定义了容器的大小(理论值)...10
4.StringBuffer类的添加功能
- (1)在结尾添加( 附加 append )
StringBuffer sb = new StringBuffer("woaixiyou");
sb.append(true);
sb.append("1001");
sb.append(10.3);
System.out.println(sb);//woaixiyoutrue100110.3
StringBuffer sb = new StringBuffer("woaixiyou");
StringBuffer sb2 = sb.append(200);
StringBuffer sb3 = sb.append(true);
System.out.println(sb3);//woaixiyou200true
System.out.println(sb2);//woaixiyou200true
StringBuffer是字符串缓冲区,当new的时候是在堆内存中创建了一个对象,底层是一个长度为16的字符数组,当调用添加方法时不会再创建对象,会源源不断的向缓存区内添加字符
- (2)在指定位置添加( 插入 insert)
StringBuffer sb = new StringBuffer("woaixiyou");
sb.insert(2,"xuesheng");
System.out.println(sb);//woxueshengaixiyou
5.StringBuffer类的删除功能
- (1)删除某个索引位置上的元素
StringBuffer sb = new StringBuffer("nishini,woshiwo");
sb.deleteCharAt(3);//删除某个索引上字符,并返回自身
System.out.println(sb);//结果:nisini,woshiwo
- (2)删除从某个索引到另一个索引之间的元素(包含头不包含尾)
StringBuffer sb = new StringBuffer("woaixiyou");
sb.delete(2,6);
System.out.println(sb);//结果为woyou
- (3)特例:清空缓存区(不要用新创建的缓存区认为是清空的,浪费内存)
StringBuffer sb = new StringBuffer("woaixiyou");
sb.delete(0,sb.length());
System.out.println(sb);
6.StringBuffer类的替换和反转功能
- 替换功能(replace[替换]):从某个索引到另一个索引之间的字符串用另一个字符串代替
StringBuffer sb = new StringBuffer();
sb.append("woaixiyou");
sb.replace(0, 2, "ni");
System.out.println(sb);//结果niaixiyou
- 反转功能( reverse[反向] ):将整个字符串进行反转
StringBuffer sb = new StringBuffer();
sb.append("woaixiyou");
sb.reverse();
System.out.println(sb);//uoyixiaow
7.StringBuffer类的截取功能(***返回值不再是StringBuffer类型而是String类型***)
- (1)从指定位置到结尾(从此索引开始之后的部分)
StringBuffer sb = new StringBuffer("woaixiyou");
String sb2 = sb.substring(4);//截取索引为4以及之后部分直到结尾
System.out.println(sb2);//结果为xiyou
- (2)从指定位置到指定结束位置(截取两个给定索引之间部分,包含头不包含尾)
StringBuffer sb = new StringBuffer("woaixiyou");
String sb2 = sb.substring(2,4);//截取索引为2以及4之间部分(包括2 不包括4)
System.out.println(sb2);//结果为ai
8.StringBuffer与String类的相互转化
- StringBuffer------>String
(1) 通过string的构造方法
StringBuffer sb = new StringBuffer("woaixiyouji");
String s = new String(sb);
System.out.println(s);
(2)通过截取的方法(如上StringBuffer的截取功能)
(3)通过Tostring方法
StringBuffer sb = new StringBuffer("woaixiyouji");
String s = sb.toString();
System.out.println(s);
- String------->StringBuffer
(1)通过构造方法
StringBuffer sb2 = new StringBuffer("woaixiyouji");
System.out.println(sb2); //结果为woaixiyouji
(2)通过append方法
StringBuffer sb = new StringBuffer();
sb.append("woaixiyouji");
System.out.println(sb);//结果为woaixiyouji
String与StringBuffer分别作为参数传递
- 基本数据类型值作为参数传递时,不改变其值
- 引用数据类型作为参数传递时,改变其值
- String虽然是引用数据类型,但是它作为参数传递时与基本数据类型相同