1.StringBuffer类
1. StringBuffer的概述:是一个线程安全的可变字符序列
2. StringBuffer和String的区别:String是长度不可变的字符序列,在对字符串进行拼接操作时,每次拼接都要创建一个新的String对象,程序执行效率不高。StringBuffer是长度可变的字符序列。StringBuffer其实可以看成是一个字符容器,可以不断地往这个容器里面添加数据
3. StringBuffer的方法
(1)构造方法
- public StringBuffer():无参构造方法
- public StringBuffer(int capacity):指定容量的字符串缓冲区对象
- public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
(2)方法
- public int capacity():返回当前容量(默认初始容量为16个字符)【理论值】
- public int length():返回当前的长度【实际值】
public class TestDemo01 {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer();
int capacity1 = sb1.capacity(); //获取容量
System.out.println(capacity1); //16
int length1 = sb1.length(); //获取长度
System.out.println(length1); //0
System.out.println("=================");
StringBuffer sb2 = new StringBuffer(100); //设定了容量
int capacity2 = sb2.capacity();
System.out.println(capacity2); //100
int length2 = sb2.length();
System.out.println(length2); //0
System.out.println("=================");
StringBuffer sb3 = new StringBuffer("abcdeasdcadasffcxqfadkh");
//往字符串缓冲区中添加内容 如果超过了默认的容量,会自动扩充
int capacity3 = sb3.capacity();
System.out.println(capacity3); //39 默认16+字符串长度23
int length3 = sb3.length();
System.out.println(length3); //23
}
}
4. StringBuffer的常用功能
(1)添加功能
- public StringBuffer append():可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
- public StringBuffer insert(int offset,Object obj):指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
public class TestDemo02 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//链式编程
sb.append("英雄联盟->").append("影流->").append("爱123我的天");
//StringBuffer重写了toString()方法,把容器中的数据以字符串的形式返回
String str = sb.toString();
System.out.println(str); //英雄联盟->影流->爱123我的天
StringBuffer sb2 = new StringBuffer();
//append()往容器中追加数据,可以把任意类型追加到容器中
sb2.append(123).append('a').append("java").append(3.14).append(true);
String str2 = sb2.toString();
System.out.println(str2); //123ajava3.14true
// public StringBuffer insert(int offset,Object obj):指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
sb.insert(6,"大区->");
System.out.println(sb.toString()); //英雄联盟->大区->影流->爱123我的天
}
}
(2)删除功能
- public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
- public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身(含头不含尾)
public class TestDemo03 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("啦啦啦啦德玛西亚");
sb.deleteCharAt(0).deleteCharAt(0).deleteCharAt(0).deleteCharAt(0);
System.out.println(sb.toString()); //德玛西亚
StringBuffer sb2 = new StringBuffer("撸啊撸啊剑圣偷塔");
sb2.delete(0,4);
System.out.println(sb2.toString()); //剑圣偷塔
}
}
(3)替换和反转功能
- public StringBuffer replace(int start,int end,String str):从start开始到end用str替换
- public StringBuffer reverse():字符串反转
public class TestDemo04 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("啦啦啦啦德玛西亚");
sb.replace(0,4,"诺克萨斯,");
System.out.println(sb.toString()); //诺克萨斯,德玛西亚
StringBuffer sb2 = new StringBuffer("啦啦啦啦德玛西亚");
sb2.reverse();
System.out.println(sb2.toString()); //亚西玛德啦啦啦啦
}
}
(4)截取功能【注意:返回值类型不是StringBuffer本身!是一个新的String】
- public String substring(int start):从指定位置截取到末尾
- public String substring(int start,int end):截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
public class TestDemo05 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("啦啦啦啦德玛西亚");
String str1 = sb.substring(4);
System.out.println(str1.toString()); //德玛西亚
StringBuffer sb2 = new StringBuffer("啦啦啦啦德玛西亚");
String str2 = sb2.substring(2,5);
System.out.println(str2.toString()); //啦啦德
}
}
(5)查找功能
- public int indexOf (String str):从头查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
- int indexOf (String str,int fromIndex):从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
public class TestDemo06 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("好运不会眷顾傻瓜");
//int indexOf (String str)
int i1 = sb.indexOf("傻");
System.out.println(i1); //6
//int indexOf (String str,int fromIndex)
int i2 = sb.indexOf("会",1);
System.out.println(i2); //3
}
}
5. StringBuffer类型和String类型的相互转换
(1)StringBuffer—>String
- 通过构造方法
- 通过substring()方法
- 通过toString()方法
(2)String—>StringBuffer - 构造方法
- 通过append()方法
public class TestDemo07 {
public static void main(String[] args) {
//StringBuffer--->String
StringBuffer sb = new StringBuffer("你的剑就是我的剑");
//1.构造方法
String str1 = new String(sb);
System.out.println(str1); //你的剑就是我的剑
//2.toString()方法
String str2 = sb.toString();
System.out.println(str2); //你的剑就是我的剑
//3.substring(0)方法
String str3 = sb.substring(0);
System.out.println(str3); //你的剑就是我的剑
System.out.println("===============");
//String--->StringBuffer
String s1 = "RNG牛逼";
//1.构造方法
StringBuffer sb2 = new StringBuffer(s1);
System.out.println(sb2); //RNG牛逼
//2.append()方法
StringBuffer sb3 = new StringBuffer();
sb3.append(s1);
System.out.println(sb3); //RNG牛逼
}
}
6. StringBuffer和StringBuilder的异同
(1)他们两个的API是相同的
(2)区别是:线程安全方面的区别
- StringBuffer:线程安全的,效率低
- StringBuilder:线程不安全的,效率高。多线程环境下,可能会存在线程安全问题
7. String和StringBuffer分别作为参数传递
(1)String作为参数传递 String虽然是引用类型,但是它是一个常量,所以在做传递的时候,完全可以将其看成基本数据类型数据进行传递
(2)StringBuffer作为引用类型进行参数传递
public class TestDemo08 {
public static void main(String[] args) {
String str = "RNG";
test(str); //RNG牛逼
System.out.println(str); //RNG
StringBuffer sb = new StringBuffer("UZI");
test(sb); //UZI永远滴神
System.out.println(sb); //UZI永远滴神
}
public static void test(String str) {
str += "牛逼";
System.out.println(str);
}
public static void test(StringBuffer sb) {
sb.append("永远滴神");
System.out.println(sb);
}
}
8. 两个关于StringBuffer的练习
(1)把数组中的数据按照指定格式拼接成一个字符串
/*
需求:把数组中的数据按照指定个格式拼接成一个字符串
举例:
int[] arr = {1, 2, 3};
输出结果:
"[1, 2, 3]"
用StringBuffer的功能实现
*/
public class TestDemo01 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
StringBuffer sb = new StringBuffer("[");
for (int i = 0; i <= arr.length - 1; i++) {
if(i != arr.length - 1){
sb.append(arr[i]).append(",");
}else {
sb.append(arr[i]).append("]");
}
}
System.out.println(sb);
}
}
(2)反转字符
/*
需求:把字符串反转
举例:键盘录入 "abc"
输出结果:"cba"
用StringBuffer的功能实现
*/
public class TestDemo02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串");
String str = sc.nextLine();
String s = new StringBuffer(str).reverse().toString();
System.out.println(s);
}
}