我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题 线程安全的可变字符序列
public final class StringBuffer 线程安全,可变的字符序列。
字符串缓冲区就像一个String ,但可以修改。
在任何时间点,它包含一些特定的字符序列, 但可以通过某些方法调用来更改序列的长度和内容。
简单记忆:它就是一个线程安全的可变字符串
2、StringBuffer和String的区别?1)StringBuffer的长度和内容都是可变的,String都不可变
2)StringBuffer可以提前给出一个缓冲区,可以进行字符串的拼接,而不会重开辟新的空间 String每创建新的字符串都会开辟新的空间
3、StringBuffer构造方法StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
4、StringBuffer的方法public int capacity() 返回当前容量。
容量是新插入字符可用的存储量,超过此值将进行分配。
public int length() 返回长度(字符数)。
// StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer sb = new StringBuffer();
System.out.println("sb: "+sb); //重写了toString()方法
System.out.println(sb.capacity());//查看初始容量16
System.out.println(sb.length());//查看字符数0
//StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区,指定的初始容量。
StringBuffer sb1 = new StringBuffer(50);
System.out.println("sb1:"+sb1);
System.out.println(sb1.capacity());//50
System.out.println(sb1.length());//0
//StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer sb2 = new StringBuffer("hello");
System.out.println("sb2:"+sb2);
System.out.println(sb2.capacity());//21 16+5
System.out.println(sb2.length());//5
5、StringBuffer类的成员方法
1)添加功能
public StringBuffer append(String str)
可以把任意类型的数据添加到字符串缓冲区中 返回的是当前字符串缓冲区本身
public StringBuffer insert(int offset,String str)
StringBuffer sb = new StringBuffer();
//public StringBuffer append(String str)
//添加任意类型数据到字符串缓冲区中
// sb.append("hello");
// sb.append(true);
// sb.append(10);
// sb.append(12.34);
// System.out.println(sb);//hellotrue1012.34
//链式编程
sb.append("hello").append(true).append(10).append(12.34);
System.out.println(sb);//hellotrue1012.34
//public StringBuffer insert(int index,String str)
//在指定的索引上,插入字符串
sb.insert(5,"java");
System.out.println(sb);//hellojavatrue1012.34
2)删除功能
public StringBuffer deleteCharAt(int index)
public StringBuffer delete(int start,int end)
StringBuffer sb = new StringBuffer();
sb.append("hello").append("java").append("bigdata");
System.out.println(sb);//hellojavabigdata
System.out.println("******************************");
//public StringBuffer deleteCharAt(int index)删除char在这个序列中的指定位置。
//返回的内容是本身
sb.deleteCharAt(5);
System.out.println(sb);//helloavabigdata
// sb.deleteCharAt(20);//StringIndexOutOfBoundsException
//public StringBuffer delete(int start,int end)
// 删除此序列的子字符串中的字符。
// 子串开始于指定start并延伸到字符索引end - 1 ,
// 或如果没有这样的字符存在的序列的结束。 如果start等于end ,则不作任何更改。
sb.delete(5,8);
System.out.println(sb);//hellobigdata
//如何利用现有方式删除所有的字符
sb.delete(0,sb.length());
System.out.println(sb);
3)替换功能
public StringBuffer replace(int start, int end, String str)
用指定的String中的字符替换此序列的子字符串中的String 。
子串开始于指定start并延伸到字符索引end - 1 ,
或如果没有这样的字符存在的序列的结束。
第一子串中的字符被去除,然后指定String被插入在start 。
( 如果需要,此序列将被延长以容纳指定的字符串。)
StringBuffer sb = new StringBuffer();
sb.append("hello").append("hadoop").append("hive").append("spark");
System.out.println(sb);//hellohadoophivespark
//public StringBuffer replace(int start,int end,String str)
//这里的start和end表示的是原来的字符串需要替换的区间,含头不含尾
sb.replace(11,12,"数加真好");
System.out.println(sb);//hellohadoop数加真好ivespark
4)反转功能
public StringBuffer reverse()
导致该字符序列被序列的相反代替。
如果序列中包含任何替代对,则将它们视为单个字符进行反向操作。
StringBuffer sb = new StringBuffer();
sb.append("我爱你");
sb.reverse();
System.out.println(sb);//你爱我
5)截取功能
String substring(int start)
返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。
String substring(int start, int end)
返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。
StringBuffer sb = new StringBuffer();
sb.append("java")
.append("hadoop")
.append("hive")
.append("spark")
.append("flink");
System.out.println(sb);//javahadoophivesparkflink
//String substring(int start)
//返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列
System.out.println("截出来的字符串为:"+sb.substring(4));//hadoophivesparkflink
System.out.println("StringBuffer的内容为:"+sb);//javahadoophivesparkflink
//String substring(int start, int end)
//返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。
System.out.println("截出来的字符串为:"+sb.substring(14,19));//spark
System.out.println("StringBuffer的内容为:"+sb);//javahadoophivesparkflink
6、StringBuffer类练习
1)String和StringBuffer的相互转换
A--B,把A转化为B,为了是使用B的功能
B--A,再把B转化为A,可能是最终的结果是需要A类型,所以还得转化回来
2)把字符串反转,键盘录入字符串//String -- StringBuffer String s="hello"; //String类型不能直接赋值给StringBuffer类型 // StringBuffer sb=s; // StringBuffer sb="hello"; //方式1:通过构造方法转换 StringBuffer sb = new StringBuffer(s); System.out.println(sb);//hello //方式2:通过StringBuffer的append()方法 StringBuffer sb1 = new StringBuffer(); sb1.append(s); System.out.println(sb1);//hello
//StringBuffer -- String StringBuffer sb2 = new StringBuffer("BigData"); //方式1:通过调用StringBuffer的toString()方法 System.out.println(sb2.toString()); //方式2:通过String的构造方法,将StringBuffer作为参数传入 String s1 = new String(sb2); System.out.println(s1);
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String s1 = sc.next();
//方式1:用String拼接
String s = "";
//将输入的字符串转化为字符数组
char [] c = s1.toCharArray();
//反转字符串
for(int i=c.length-1;i>=0;i--){
s+=c[i];
}
//输出
System.out.println("反转后的字符串1:"+s);
//方法2:利用StringBuffer的reverse()方法
StringBuffer sb = new StringBuffer(s1);
System.out.println("反转后的字符串2:"+sb.reverse());
}
}
3)把数组拼接成一个字符串(用StringBuffer实现)
char[] chars = {'a','b','c','d'};
StringBuffer sb = new StringBuffer();
for(int i = 0; i



