StringBuffer类
由于字符串一旦定义之后,长度是不可变的,如果我要采用+号大量拼串,比较浪费空间。
Java为我们提供StringBuffer这个类,是一个长度可变的字符容器,可以存储多个字符,可以不断的往容器中追加内容。
1.安全问题
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。、,但通过某些方法调用可以改变该序列的长度和内容。
2.StringBuffer和String的区别
StringBuffer是线程安全的,但效率特别低的可变字符串。
String是不可改变的字符串,不是线程安全的。
3.StringBuffer类的构造方法
A:StringBuffer的构造方法:
public StringBuffer(): 无参构造方法;
public StringBuffer(int capacity): 指定容量的字符串缓冲区对象;
public StringBuffer(String str): 指定字符串内容的字符串缓冲区对象;
B:StringBuffer的方法:
public int capacity():返回当前容量。 理论值
public int length():返回长度(字符数)。 实际值
4.StringBuffer的添加功能
public StringBuffer append(String str): 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身;
public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身;
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append(100).append(200);
//在指定的索引处插入内容
sb.insert(1, "abc");//返回的还是原来的容器
System.out.println(sb);
}
}
5.StringBuffer的删除功能
public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
public static void main(String[] args) {
//删除相关的方法
StringBuffer sb = new StringBuffer("abcafeadsfaewfasdf你好啊");
//根据指定索引删除单个字符,返回的还是容器本身
sb.deleteCharAt(0);
sb.delete(0, sb.length());//根据开始索引,和结束索引删除一段数据 含头不含尾 返回的还是容器本身
System.out.println(sb);
}
}
6.StringBuffer的替换和反转功能
A:StringBuffer的替换功能
public StringBuffer replace(int start,int end,String str): 从start开始到end用str替换
B:StringBuffer的反转功能
public StringBuffer reverse(): 字符串反转
public class MyTest3 {
public static void main(String[] args) {
//替换的方法
StringBuffer sb = new StringBuffer("abc ccc ddd fff");
//从开始索引,到结束索引,替换成新的内容,返回的还是容器本身
sb.replace(0, sb.length(), sb.toString().substring(0,sb.indexOf(" ")));
System.out.println(sb);
}
}
public class MyTest4 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abcd");
//反转容器中的内容,返回的还是容器本身
sb.reverse();
System.out.println(sb);
}
}
7.StringBuffer的截取功能
public String substring(int start): 从指定位置截取到末尾
public String substring(int start,int end): 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
注意:返回值类型不再是StringBuffer本身;
8.StringBuffer和String的相互转换
A:String – StringBuffer
a:通过构造方法
b:通过append()方法
B:StringBuffer – String
a: 使用substring方法
b:通过构造方法
c:通过toString()方法
public class MyTest {
public static void main(String[] args) {
//String-- StringBuffer
String str="abc";
//方式1
StringBuffer sb = new StringBuffer(str);
//方式2
StringBuffer sb2 = new StringBuffer().append(str);
StringBuffer sb3 = new StringBuffer().insert(0, str);
StringBuffer sb4 = sb.replace(0, str.length(), str);
//StringBuffer----String
StringBuffer sb5= new StringBuffer("abc");
//方式1
String string = sb5.toString();
//方式2
String substring = sb5.substring(0);
//方式3
//String(StringBuffer buffer)
//分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。
String s = new String(sb5);
}
}
9.把数组转成字符串
需求:把数组中的数据按照指定个格式拼接成一个字符串。
public class MyTest {
public static void main(String[] args) {
//需求:把数组中的数据按照指定个格式拼接成一个字符串
//举例:
//int[] arr = {1, 2, 3};
//输出结果:
//用StringBuffer的功能实现
int[] arr = {1, 2, 3};
//"[1, 2, 3]"
StringBuffer sb = new StringBuffer("[");
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1){
sb.append(arr[i]).append("]");
}else{
sb.append(arr[i]).append(",");
}
}
String string = sb.toString();
System.out.println(string);
}
}
10.字符串反转
需求:把字符串反转
举例:键盘录入"abc"
输出结果:“cba”
用StringBuffer的功能实现
public class MyTest2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
String str = sc.nextLine();
StringBuffer sb = new StringBuffer(str);
String string = sb.reverse().toString();
System.out.println(string);
}
}
11.StringBuffer和StringBuilder的区别
StringBuffer 字符串缓冲区 线程安全的 效率低;
StringBuilder 字符串缓冲区 线程不安全 效率高;
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换;
用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
12.String和StringBuffer分别作为参数传递
String作为参数传递 String虽然是引用类型,但是它是一个常量,所以在做传递的时候,完全可以将其看成基本数据类型数据进行传递;
基本类型作为参数传递,形参的改变,不影响实参;
引用类型作为参数传递,形参的改变,会影响实参;
值传递,引用传递;
String 类型作为参数传递,跟基本类型一样;
public class MyTest {
public static void main(String[] args) {
String str = "abc";
setString(str);
System.out.println(str); //2 "abc"
StringBuffer sb = new StringBuffer("你好世界");
setStringBuffer(sb);
System.out.println(sb.toString());//
}
private static void setStringBuffer(StringBuffer sb) {
sb.append("爱生活,爱Java").reverse();
}
private static void setString(String str) {
str = str + "dddd";
System.out.println(str); // 1 "abcdddd"
}
}