StringBuffer类
概述
- 字符缓冲区类
- 线程安全的可变字符串序列
- final修饰不能有子类
- 和String的区别
String-----不可变的字符序列
StringBuffer----可变的字符序列,append等方法实现。
构造方法
编号 | 构造方法 | 说明 |
---|---|---|
a | StringBuffer() | 构造一个没有字符的字符串缓冲区,初始容量为16个字符。 |
b | StringBuffer(CharSequence seq) | 构造一个包含与指定的相同字符的字符串缓冲区CharSequence(是char值的可读序列。 |
c | StringBuffer(int capacity) | 构造一个没有字符的字符串缓冲区和指定的初始容量。 |
d | StringBuffer(String str) | 构造一个初始化为指定字符串内容的字符串缓冲区。 |
- 每个字符串缓冲区都有一个容量。
- 只要字符串缓冲区中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区**数组**。
- 如果内部缓冲区溢出,则会自动变大。
StringBuilder类
jdk1.5推出,支持所有相同的操作,但由于不执行同步更快,所以一般优先选择StringBuilder。
使用范例
//a
//最常用
StringBuffer sb = new StringBuffer();
len = sb.length(); // 0
cap = sb.capacity(); // 16
//b 不常用
//c
StringBuffer sb2 = new StringBuffer(10);
len = sb.length(); // 0
cap = sb.capacity(); // 16
//d
StringBuffer sb3 = new StringBuffer("mona");
len = sb.length(); // 4
cap = sb.capacity(); // 20
成员方法
length() && capacity()
len = sb.length(); 容器的初始容量,理论值
cap = sb.capacity(); 容器中的字符个数,实际值(String没有)
append() && insert()
编号 | 构造方法 | 说明 |
---|---|---|
a | public StringBuffer append(String str) | 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身 |
b | public StringBuffer insert(int offset,String str) | 在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身 |
StringBuffer sb = new StringBuffer();
StringBuffer sb2 = sb.append(true);
StringBuffer sb3 = sb.append("mona");
StringBuffer sb4 = sb.insert(4,100)
//完成上述操作后,得到结果sb,sb2,sb3,sb4的值均为 true100mona
- 实际上append()和insert()方法操作的都是同一对象,不同引用sb sb2等引用都指向了同一个地址。
- 两个方法都采用重载,可以传入各种数据类型
- insert(int offset,String str)方法中的offset值易越界,报索引越界异常,需注意判断
toString()
StringBuffer类重写了Object类的toString()方法,显示的是对象的属性值。
System.out.println(sb.toString());
//得到数据的字符串形式
deleteCharAt() && delete()
编号 | 构造方法 | 说明 |
---|---|---|
a | public StringBuffer deleteCharAt(int index) | 删除指定位置的字符,并返回本身 |
b | public StringBuffer delete(int start,int end) | 删除从指定位置开始到指定位置结束的内容,并返回本身 |
StringBuffer sb = new StringBuffer("mona");
sb.deleteCharAt(3);
System.out.println(sb.toString());
sb.delete(1,2); //包含头,不包含尾
System.out.println(sb.toString());
//得到结果mon mn
- 两个方法中涉及的索引值均易越界,报索引越界异常,需注意判断。
- delete()方法只包含头,不包含尾。
replace() && reverse()
编号 | 构造方法 | 说明 |
---|---|---|
a | public StringBuffer replace(int start,int end,String str) | 从start开始end用str替换 |
b | public StringBuffer reverse() | 字符串反转 |
StringBuffer sb = new StringBuffer("mona");
sb.replace(2,4,"ly");
System.out.println(sb.toString());
sb.reverse();
System.out.println(sb.toString());
//得到结果moly ylom
- replace方法中涉及的索引值均易越界,报索引越界异常,需注意判断。
- replace()方法只包含头,不包含尾。
- 不宜用String sb = new StringBuffer()来删除内容,实际是换了引用,原对象变垃圾。
substring()
public String substring(int start) — 截取start(包含)到末尾
public String substring(int start,int end) —截取start(包含)到end(不包含)
StringBuffer sb = new StringBuffer("monalily");
String s1 = sb.substring(3);
System.out.println(s1);
String s2 = sb.substring(1,3);
System.out.println(s2);
System.out.println(sb.toString());
//得到结果 alily on monalily
- substring不对原StringBuffer对象产生影响,而是生成新的String对象,需要新的引用接收。
substring()
public String substring(int start) — 截取start(包含)到末尾
public String substring(int start,int end) —截取start(包含)到end(不包含)
StringBuffer sb = new StringBuffer("monalily");
String s1 = sb.substring(3);
System.out.println(s1);
String s2 = sb.substring(1,3);
System.out.println(s2);
System.out.println(sb.toString());
//得到结果 alily on monalily
- substring不对原StringBuffer对象产生影响,而是生成新的String对象,需要新的引用接收。
String和StringBuffer的相互转换
String–>StringBuffer
public String substring(int start) — 截取start(包含)到末尾
public String substring(int start,int end) —截取start(包含)到end(不包含)
StringBuffer sb = new StringBuffer("monalily");
String s1 = sb.substring(3);
System.out.println(s1);
String s2 = sb.substring(1,3);
System.out.println(s2);
System.out.println(sb.toString());
//得到结果 alily on monalily
- substring不对原StringBuffer对象产生影响,而是生成新的String对象,需要新的引用接收。
String–>StringBuffer
a.通过StringBuffer的构造方法
b.通过StringBuffer的append()方法
String s1 = "1234upupup";
//a
StringBuffer sb1 = new StringBuffer(s1);
System.out.println(sb1);
//b
StringBuffer sb2 = new StringBuffer();
sb2.append(s1);
System.out.println(sb2);
StringBuffer–>String
a.通过String的构造方法
b.StringBuffer的toString方法
c.StringBuffer的substring方法
StringBuffer sb1 = new StringBuffer("upupup121");
//a
String s1 = new String(sb1);
System.out.println(s1);
//b
String s2 = sb1.toString();
System.out.println(s2);
//c
String s3 = sb1.substring(0,sb1.length());
System.out.println(s3);
综合应用范例
把数组转成字符串
把数组中的数据按指定格式拼接成一个字符串
例:int[] arr = {1,2,4}; ----> “[1,2,4]”
int[] arr = {1,2,4};
StringBuffer sb = new StringBuffer();
sb.append("[");
for(int i=0;i<arr.length;i++){
if(i==0){
sb.append(arr[i]);
}else{
sb.append(","+arr[i]);
}
}
sb.append("]");
System.out.println(sb.toString());
字符串反转
例:键盘输入“abc”,输出结果“cba”.
Scanner sc = new Scanner(System.in);
String s1 = sc.nextLine();
StringBuffer sb1 = new StringBuffer(s1);
sb1.reverse();
System.out.println(sb1.toString());
三种字符类区别
StringBuffer、StringBuilder
StringBuffer是线程安全的,效率低
StringBuilder是线程不安全的,效率高
String和上述两类
String是一个不可变的字符序列
StringBuffer和StringBuilder是可变的字符序列
作为参数时区别
回顾知识:
-基本数据类型的值传递时,赋值其值,本身不改变其值
-引用数据类型的值传递时,赋值其址,本身改变其值,不改变其址
String类虽为引用数据类型,但其作为参数传递时用法和基本数据类型一样。
StringBuffer类则是标准的引用数据类型的方式。