一:StringBuffer类概述
我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。而StringBuffer就可以解决这个问题。
StringBuffer:线程安全的可变字符序列。
StringBuffer与String的区别?
A:前者长度的内容可变,后者不可变
B:如果使用前者进行字符产拼接,不浪费太多资源,在原字符序列上进行拼接,不需要改变引用。
1:构造方法
public StringBuffer() //无参构造,一般使用第一个。StringBuffer sb = new StringBuffer();//创建字符串缓冲区
public StringBuffer(int capacity)//指定容量的字符串缓冲区对象
public StringBuffer(String str)//指定字符串内容的字符串缓冲区对象
2:StringBuffer的方法
获取功能
public int capacity ();返回当前容量,理论值
public int length ();返回长度,实际值
添加功能
public StringBuffer append(String str)//可以把任意类型数据添加到字符串缓冲区,及串尾,并返回字符串缓冲区本身。
public StringBuffer insert(int offset,String str)//在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
删除功能
public StringBuffer deleteCharAt(int index)//删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end)//删除从指定位置开始到end-1的内容,并返回本身(包左不包右)
替换功能
public StringBuffer replace(int start,int end,String str)//从start开始到end-1用str替换,并返回本身,(包左不包右)
反转功能 public StringBuffer reverse() //反转字符串缓冲区中的内容,返回本身
截取功能
public String substring(int start)//从指定位置开始到结尾进行截取
public String substring(int start,int end)//从指定位置到end-1进行截取
截取功能和前面几个功能的不同
返回值类型是String类型,StringBuffer本身对象没有发生改变
**案例1**:String和StringBuffer之间的转换
public class StringBufferTest {
public static void main(String[] args) {
String s = "Hello";
//String —— StringBuffer
//方式一:构造方法
StringBuffer sb = new StringBuffer(s);
System.out.println(sb);
//方拾二:attend方法
StringBuffer sb1 = new StringBuffer(s);
sb.append(s);
System.out.println(sb1);
//StringBuffer —— String
//方式一:构造方法
StringBuffer sb2 = new StringBuffer("Java");
String s1 = new String(sb2);
System.out.println(sb2);
//方式二:toString方法
s1 = sb2.toString();
System.out.println(sb2);
}
}
**案例二**:用reverse()方法将字符串进行反转
public class StringBufferTest1 {
public static void main(String[] args) {
String s = "我不爱你宝贝";
System.out.println(s);
StringBuffer sb = new StringBuffer(s);//将字符串转换为StringBuffer类型
sb.reverse();//调用StringBuffer类中的反转方法
//将StringBuffer转换为String类型
//方式一:用toString方法
s = sb.toString();
System.out.println(s);
//方式二:用String的构造方法
String s1 = new String (sb);
System.out.println(s1);
}
}
**案例三**:判断字符串是否对称
public class StringBufferTest2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要判断的字符串");
String s = sc.nextLine();
System.out.println(StringBufferTest2.isSame(s));
System.out.println(StringBufferTest2.isSame1(s));
}
//将字符串转换为字符数组,再遍历比较
public static boolean isSame(String s ){
char ch [] = s.toCharArray();
for (int start = 0, end = ch.length -1; start <= end ;start++,end--){
if(ch[start] != ch[end]){
return false;
}
}
return true;
}
//使用StringBuffer功能
public static boolean isSame1(String s ){
return new StringBuffer(s).reverse().toString().equals(s);
}
}
**案例四**面试题
1:String ,StringBuffer,StringBuilder的区别?
A:String是内容不可变的,而StringBuffer,StringBuilder都是可变的。
B:StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高
2:StringBuffer和数组的区别?
二者都可以看做一个容器,装其他数据,但是StringBuffer的数据最终是一个字符串数据,而数组可以放置多种数据,但必须是同一种类型的。
3形式参数问题
String作为参数传递:效果和基本类型作为参数传递是一样的
StringBuffer作为参数传递:效果是正常的引用类型传参效果
形式参数:基本类型:形式参数的改变不影响实际参数
引用类型:形式参数的改变直接影响实际参数
public class StringBufferTest3 {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "world";
System.out.println(s1+ "——————"+s2);//原本字符串
change(s1,s2);
System.out.println(s1+ "——————"+s2);//用String类型作为参数传递进行change()方法
StringBuffer sb1 = new StringBuffer(s1);
StringBuffer sb2 = new StringBuffer(s2);
change1(sb1,sb2);
System.out.println(sb1+ "——————"+sb2);//用StringBuffer类型作为参数传递进行change()方法
}
private static void change1(StringBuffer s1, StringBuffer s2) {
// TODO Auto-generated method stub
s1 = s2;
s2 = s2.append(s1);
}
public static void change(String s1, String s2) {
// TODO Auto-generated method stub
s1 = s2;
s2 = s2 + s1;
}
}