1.StringBuffer类的概述
我们如果对字符串进行拼接,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。
StringBuffer就可以解决这个问题。
是线程安全的可变字符序列。
1.1、StringBuffer和String的区别
StringBuffer长度和内容可以改变,String不可变。
使用StringBuffer来拼接字符串,不会浪费太多的空间资源。
1.2、线程安全
数据同步,安全。例如:医院网站,银行网站等
数据不同步,不安全,但是效率高。例如:新闻网站,论坛等
安全和效率不可兼得。
2、StringBuffer类的方法
A:StringBuffer的构造方法:
public StringBuffer():无参构造方法
public StringBuffer(int capacity): 指定容量的字符串缓冲区对象
public StringBuffer(String str): 指定字符串内容的字符串缓冲区对象
public class MyTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
System.out.println(sb);// 空 ""
System.out.println(sb.capacity());//16
System.out.println(sb.length());//0
System.out.println("---------------");
StringBuffer sb2 = new StringBuffer(30);
System.out.println(sb2);// 空 ""
System.out.println(sb2.capacity());//30
System.out.println(sb2.length());//0
System.out.println("---------------");
StringBuffer sb3 = new StringBuffer("hello");
System.out.println(sb3);//hello
System.out.println(sb3.capacity());//21
System.out.println(sb3.length());//5
}
}
B:StringBuffer的方法:
public int capacity():返回当前容量。 理论值
public int length():返回长度(字符数)。 实际值
3、StringBuffer的添加功能
StringBuffer的添加功能
public StringBuffer append(String str): 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
StringBuffer sb = new StringBuffer();
StringBuffer sb1 = sb.append("hello");
System.out.println(sb);//hello
System.out.println(sb1);//hello 因为返回的是字符串缓冲区本身
sb.append("hello").append("world").append("java");
System.out.println(sb);//hellohelloworldjava
sb.insert(5,"新年快乐");
System.out.println(sb);
4、StringBuffer的删除功能
public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world").append("java");
sb.deleteCharAt(1);
System.out.println(sb);//hlloworldjava
sb.delete(4, 9);//含头不含尾
System.out.println(sb);//hllojava
5、StringBuffer的替换和反转功能
//反转
StringBuffer sb = new StringBuffer();
sb.append("abcde");
sb.reverse();
System.out.println(sb);//edcba
//替换
sb.replace(1,3,"ABCDE");
System.out.println(sb);//eABCDEba
6、StringBuffer的截取功能及注意事项
A:StringBuffer的截取功
public String substring(int start): 从指定位置截取到末尾
public String substring(int start,int end): 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
B:注意事项
注意:返回值类型不再是StringBuffer本身
//截取功能 返回的是一个字符串类型
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world").append("java");
String s1 = sb.substring(5);
System.out.println(s1);//worldjava
String s2 = sb.substring(5, 10);
System.out.println(s2);//world
7、StringBuffer和String的相互转换
A:String – StringBuffer
a:通过构造方法
b:通过append()方法
B:StringBuffer – String
a: 使用substring方法
b:通过构造方法
c:通过toString()方法
//String 转 StringBuffer
//注意:不能给stringBuffer直接赋值字符串
String str ="helloworldjava";
//方式1:通过构造方法
StringBuffer sb = new StringBuffer(str);
//方式二:通过append()方法
StringBuffer sb2 = new StringBuffer();
StringBuffer sb3 = sb2.append(str);
//StringBuffer 转 String
StringBuffer sb4 = new StringBuffer();
sb4.append("hello").append("world").append("java");
//方式一:使用subString()方法
String s4 = sb4.substring(0);
System.out.println(s4);//helloworldjava
//方式二 通过构造方法
String s5 = new String(sb4);
System.out.println(s5);//helloworldjava
//方式三 通过toString()方法
String s6 = sb4.toString();
System.out.println(s6);
7.1、为什么要进行转换
A:String – StringBuffer
我们将String 转换为StringBuffer,是为了使用StringBuffer的功能。
B:StringBuffer – String
我们有时需要的结果是String类型,所以需要转回来。
8、把数组转成字符串
需求:把数组中的数据按照指定个格式拼接成一个字符串
举例:
int[] arr = {1,2,3};
输出结果:
"[1, 2, 3]"
用StringBuffer的功能实现
public class MyTest7 {
public static void main(String[] args) {
/*需求:把数组中的数据按照指定个格式拼接成一个字符串
举例:
int[] arr = {1,2,3};
输出结果:
"[1, 2, 3]"
用StringBuffer的功能实现*/
int[] arr = {1,2,3};
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length-1){
sb.append(arr[i]);
}else {
sb.append(arr[i]).append(",");
}
}
sb.append("]");
System.out.println(sb);//[1,2,3]
}
}
9、字符串反转
需求:把字符串反转
举例:键盘录入"abc"
输出结果:“cba”
用StringBuffer的功能实现
public class MyTest8 {
public static void main(String[] args) {
/* 需求:把字符串反转
举例:键盘录入"abc"
输出结果:"cba"
用StringBuffer的功能实现*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串");
String s = scanner.nextLine();
StringBuffer sb = new StringBuffer(s);
sb.reverse();
System.out.println(sb.toString());
}
}
10、StringBuffer和StringBuilder的区别
10.1、StringBuilder的概述
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
10.2、面试题
-
String,StringBuffer,StringBuilder的区别
-
String是内容不可变的字符序列。而StringBuffer和StringBuilder都是内容可变的字符序列。
-
StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高。
-
StringBuffer和数组的区别
-
二者都可以看成是一个容器,用来存放其他的数据。
-
但是 StringBuffer存放的数据最终是一个字符串数据。
-
数组可以存放多种数据,但是必须是同一种类型。
10.3(String和StringBuffer分别作为参数传递
形式参数:
- 基本类型:形式参数的改变不影响实际参数
- 引用类型:形式参数的改变直接影响实际参数
String作为参数传递 String虽然是引用类型,但是它是一个常量,所以在做传递的时候,完全可以将其看成基本数据类型数据进行传递
StringBuffer作为参数传递
public class MyTest9 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
System.out.println(s1+"===="+s2);//hello====world
change(s1,s2);
System.out.println(s1+"===="+s2);//hello====world
StringBuffer sb1 = new StringBuffer();
sb1.append("hello");
StringBuffer sb2 = new StringBuffer();
sb2.append("world");
System.out.println(sb1+"===="+sb2);//hello====world
change(sb1,sb2);
System.out.println(sb1+"===="+sb2);//hello====worldworld
}
public static void change(String s1,String s2){
s1=s2;
s2=s1+s2;
}
public static void change(StringBuffer sb1,StringBuffer sb2){
sb1=sb2;
sb2=sb1.append(sb2);
}
}