java.lang.StringBuffer
1.概述
如果对字符串进行拼接操作,每次拼接都会构造一个新的String对象,既费时,又浪费空间。而StringBuffer就可以解决这个问题。
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
2.StringBuffer与String的区别
前者字符长度和内容可变,后者不可变;
如果使用前者进行字符串的拼接,不会浪费太多资源
3.构造方法
StringBuffer()
构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
StringBuffer(int capacity)
构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
4.成员方法
添加功能:
public StringBuffer append(String str)
append方法可以将任意类型数据添加到字符串缓冲区里,并且返回缓冲区本身
public StringBuffer insert(int begin,String str)
insert方法在指定位置将任意类型的数据插入到字符串缓冲区里,并且返回缓冲区本身
删除功能:
public StringBuffer deleteCharAt(int index)
删除指定位置的字符,并返回缓冲区本身
public StringBuffer delete(int start,int end)
删除索引是start~(end-1)处的字符,并返回缓冲区本身(包左不包右)
替换功能:
public StringBuffer replace(int start,int end,String str)
将索引是start~(end-1)处的字符替换为字符串str,并返回缓冲区本身(包左不包右)
反转功能:
public StringBuffer reverse()
即从尾到头
截取功能:
String substring(int start)
截取索引为start到串尾的字符序列(包含start位置),并且返回该序列内容的字符串型
String substring(int start, int end)
截取索引为start到(end-1)的一段字符序列(包左不包右),并且返回该序列内容的字符串型
5.StringBuffer与String之间的互换
A.String转换为StringBuffer
a.通过构造方法:StringBuffer(String str)
B.StringBuffer换换为String
a.通过构造方法:
之前讲String类的构造方法,还有一个:String(StringBuffer buffer)
b.StringBuffer类的String toString()
6.有关StringBuffer的面试题:
StringBuffer与StringBuilder的区别:
几乎相同,二者都是可变字符序列。区别是StringBuffer是同步的,线程安全,效率比String高很多,但比StringBuilder低;
StringBuilder不保证同步,线程不安全,高效率。
package API_ordinary;
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
//其中int capacity():返回当前容量(可理解为缓存区容量,无参构造时,初始容量是16)
System.out.println(sb.length()+","+sb.capacity());
//缓冲区的容量(字符数)为capacity,等于20
StringBuffer sb2=new StringBuffer(20);
System.out.println(sb2.length()+","+sb2.capacity());
//下面缓存区的容量等于16+5=21,需要注意
StringBuffer sb3=new StringBuffer("hello");
System.out.println(sb3.length()+","+sb3.capacity());
System.out.println(sb3);
//添加功能
//追加
StringBuffer s=new StringBuffer();
s.append("hello");
s.append(5);
s.append(false);
s.append(3.1415926);
System.out.println(s);
//插入
//从索引2的位置起(包含2)开始插入,相应字符后移动
s.insert(2, "HE");
System.out.println(s);
//删除功能
s.deleteCharAt(2);
System.out.println(s);
s.delete(0, 6);//包左不包右
System.out.println(s);
//替换功能
s.replace(1, 6, "true");//包左不包右
System.out.println(s);
//反转功能
System.out.println(s.reverse());
//截取功能
StringBuffer s2=new StringBuffer();
s2.append("hello").append("world").append("java");
System.out.println(s2);
//演示:String substring(int start)
String str=s2.substring(5);
System.out.println(str);
System.out.println(s2);//缓冲区本身没有变
String str2=s2.substring(5,10);//包左不包右
System.out.println(str2);
//演示:StringBuffer与String的互换
String str3="abc";
StringBuffer sb4=new StringBuffer(str3);
sb4.append(123).append("ABC");
String str4=new String(sb4);
String str5=sb4.toString();
System.out.println(str4+" "+str5);
//StringBuffer类练习
//演示:将任意数组拼接成字符串
int[] a=new int[]{11,33,22,44,55,77,66,88};
StringBuffer buffer=new StringBuffer();
for(int out:a)
{
buffer.append(out);
}
String str6=buffer.toString();
System.out.println(str6);
//演示:将字符串反转
String str7="helloworld";
StringBuffer buffer2=new StringBuffer(str7);
str7=buffer2.reverse().toString();
System.out.println(str7);
//演示:判断是否是对称字符串
str7="abcde";
String str8="abcba";
StringBuffer buffer3=new StringBuffer(str7);
if(buffer3.reverse().toString().equals(str7))
System.out.println(str7+"是对称字符串");
else
System.out.println(str7+"不是对称字符串");
//清空字符串缓冲区(int start,int end)包左不包右
buffer3.delete(0, buffer3.length());
buffer3.append(str8);
if(buffer3.reverse().toString().equals(str8))
System.out.println(str8+"是对称字符串");
else
System.out.println(str8+"不是对称字符串");
}
}
0,16
0,20
5,21
hello
hello5false3.1415926
heHEllo5false3.1415926
heEllo5false3.1415926
5false3.1415926
5true3.1415926
6295141.3eurt5
helloworldjava
worldjava
helloworldjava
world
abc123ABC abc123ABC
1133224455776688
dlrowolleh
abcde不是对称字符串
abcba是对称字符串