StringBuffer类的概述和功能
String Buffer类的该概述:
String对象创建后就不可改变,针对每次对字符串拼接都需要创造一个新的String对象,耗时切浪费空间;
StringBuffer是线程安全的可变字符序列,相当于一个字符容器,你可以不断的往容器中追加字符。
案例:
public class BlogTest1 {
public static void main(String[] args) {
//新建一个StringBuffer()字符串容器;
StringBuffer sbuff = new StringBuffer();
//给字符串容器中追加数据,默认16个字节,但是可以扩容;
sbuff.append("123456789123456789");
//获取字符串容器容量
int capacity = sbuff.capacity();
System.out.println("容量 "+capacity);
//获取字符串容器中字符串的长度
int length = sbuff.length();
System.out.println("长度 "+length);
}
}
//打印结果:
容量 34
长度 18
Process finished with exit code 0
StringBuffer类的添加和删除功能
添加功能:
public StringBuffer append(String str): 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
添加案例:
public class BlogTest2 {
public static void main(String[] args) {
StringBuffer sbuff = new StringBuffer();
//往容器中追加数据,返回的还是原来的那个容器对象
StringBuffer sbuff2 = sbuff.append("hello");
System.out.println(sbuff2);
//StringBuffer 里面的数据也是编有索引的。
insert(0, "eeee"); 在容器中的指定位置,插入数据,返回的还是原来的容器。
StringBuffer sbuff3 = sbuff2.insert(sbuff.length() , "java");
System.out.println(sbuff3);
//StringBuffer 重写了toString()方法,把容器中的数据转换成字符串返回
String s = sbuff2.toString();
System.out.println(s);
}
}
结果:
hello
hellojava
hellojava
Process finished with exit code 0
删除功能:
public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并 返回本身
删除案例:
public class BlogTest2 {
public static void main(String[] args) {
//public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
StringBuffer sbuff = new StringBuffer("abcdefg");
StringBuffer sbuff2 = sbuff.deleteCharAt(1);
System.out.println("deleteCharAt删除指定位置的字符,返回本身 " + sbuff2);
//public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的 内容,并返回本身
StringBuffer sbuff3 = sbuff.delete(1, 3);
System.out.println("delete删除指定范围的字符串,返回本身 " + sbuff3);
}
}
结果:
deleteCharAt删除指定位置的字符,返回本身 acdefg
delete删除指定范围的字符串,返回本身 aefg
Process finished with exit code 0
StringBuffer类的替换和反转功能:
StringBuffer的替换功能:
public StringBuffer replace(int start,int end,String str): 从start开始到end用str替换
替换案例演示:
public class BlogTest3 {
public static void main(String[] args) {
//StringBuffer的替换功能
//public StringBuffer replace(int start,int end,String str): 从start开始到 end用str替换
StringBuffer s1 = new StringBuffer("abcdefg");
//打印容器里原来的存放的字符串;
System.out.println(s1);
StringBuffer s2 = s1.replace(2, 5, "234");
//打印将从索引(2)开始到索引(5)之间的字符串替换成"234"后的字符串;
System.out.println(s2);
}
}
结果:
abcdefg
ab234fg
Process finished with exit code 0
StringBuffer的反转功能:
public StringBuffer reverse(): 字符串反转
演示代码:
public class BlogTest4 {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("abcdefg");
//打印容器中存储的原字符串;
System.out.println(s1);
StringBuffer s2 = s1.reverse();
//打印反转后的字符串;
System.out.println(s2);
}
}
结果:
abcdefg
gfedcba
Process finished with exit code 0
StringBuffer类的查找功能
从头查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
int indexOf (String str)
从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
int indexOf (String str,int fromIndex)
从后往前查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
int lastIndexOf (String str)
从指定索引处开始从后往前查找该字符串第一次出现的索引,如果找不到就返回-1
int lastIndexOf (String str,int fromIndex)
案例演示:
public class BlogTest5 {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("abcdecfg");
//打印"c"第一次出现的索引;
System.out.println(s1.indexOf("c"));
//从索引(1)开始,打印c第一次出现的值
System.out.println(s1.indexOf("c",1));
//从后向前查找"c"第一次出现的索引
System.out.println(s1.lastIndexOf("c"));
//从索引(3)开始,向前查找"c"出现的索引值
System.out.println(s1.lastIndexOf("c", 3));
}
}
结果:
2
2
5
2
Process finished with exit code 0
StringBuffer类的截取功能
StringBuffer的截取功能
public String substring(int start): 从指定位置截取到末尾
public String substring(int start,int end): 截取从指定位置开始到结束位置,包括开始 位置,不包括结束位置
特别注意:
返回值类型不再是StringBuffer本身
案例演示:
public class BlogTest6 {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("abcdefg");
//从索引(3)截取到末尾,返回字符串,打印;
String s2=s1.substring(3);
System.out.println(s2);
//从索引(2)截取到索引(4),返回字符串,打印;
String s3 = s1.substring(2, 4);
System.out.println(s3);
}
}
结果:
defg
cd
Process finished with exit code 0
StringBuffer和String的相互转换
字符串类型转换成字符串容器
String -- StringBuffer
1.通过构造方法
2.通过append()方法
案例:
public class BlogTest6 {
public static void main(String[] args) {
//字符串"abcde"
String s = "abcde";
System.out.println("s: "+s);
//通过构造方法,将字符串"abcde"存入sbuff容器里。
StringBuffer sbuff = new StringBuffer(s);
System.out.println("sbuff: "+sbuff);
//通过append()方法,将字符串"abcde"存入sbuff容器里。
StringBuffer sbuff2 = new StringBuffer();
sbuff2.append(s);
System.out.println("sbuff2: "+sbuff2);
}
}
结果:
s: abcde
sbuff: abcde
sbuff2: abcde
Process finished with exit code 0
字符串容器转换为字符串类型
StringBuffer -- String
1.使用substring方法
2.通过构造方法
3.通过toString()方法
案例演示:
public class BlogTest7 {
public static void main(String[] args) {
StringBuffer sbuff = new StringBuffer("abcdefg");
//使用substring方法:
String s1=sbuff.substring(0);
System.out.println("s1: "+s1);
//通过构造方法
String s2 = new String(sbuff);
System.out.println("s2: "+s2);
//通过toString()方法
String s3 = sbuff.toString();
System.out.println("s3: "+s3);
}
}
结果:
s1: abcdefg
s2: abcdefg
s3: abcdefg
Process finished with exit code 0
StringBuffer类和String分别作为参数传递
形式参数问题
String作为参数传递 String虽然是引用类型,但是它是一个常量,所以在做传递的时候,完全可以将其看 成基本数据类型数据进行传递,String类型输入值传递
StringBuffer作为参数传递 StringBuffer是引用类型,传递的时候是传递地址值
案例:
String str = "abc";
change(str);
System.out.println(str);//abc
StringBuffer sb = new StringBuffer("Hello");
change(sb);
System.out.println(sb); //hellojava
}
private static void change(StringBuffer sb) {
sb.append("java")
}
private static void change(String str) {
str+="你好";
System.out.println(str); //abc你好
结果:
abc
abc你好
hellojava
Process finished with exit code 0
StringBuffer和StringBuilder的区别
StringBuffer 线程安全的字符序列,效率低
StringBuilder 一个可变的字符序列,线程不安全的,效率高
此类提供一个与 StringBuffer 兼容的 API,但不保证同步。
该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。